2009-07-09 56 views
3

對於TCP阻塞套接字,它是安全調用:recv傳入0來檢測套接字錯誤是否安全?

if(SOCKET_ERROR != recv(s, NULL, 0, 0)) 
//... 

檢測錯誤?

我認爲這是安全的,那麼我有一個計算機上的情況,它掛在這個聲明。 (如果重要的話,使用ssl套接字)。我也嘗試傳遞MSG_PEEK標誌與指定的緩衝區,但我也有一個掛在那裏。

什麼是替代方案?

+0

我在Windows上,如果該事項。 – 2009-07-09 12:06:38

回答

4

除了其他的答案 - 這裏有一個方便的小功能,讓懸而未決的套接字錯誤:


/* Retrives pending socket error. */ 
int get_socket_error(int sockfd) 
{ 
    int error; 
    socklen_t len(sizeof(error)); 

    if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) 
     error = errno; 

    return error; 
} 
3

你確實說過你正在使用阻塞套接字,但你應該使用select來代替(即使你在select選擇調用之前將它設置爲unblocking)。它允許您輪詢文件描述符並查看是否有數據等待,或者是否有錯誤。

2

呼叫本身是「安全」的,因爲它應該作爲documented工作,但是您必須認識到recv是阻止接收呼叫。這意味着該調用將阻塞正在執行的線程,直到數據到達套接字。這可能會導致您的應用程序「掛起」,如果您沒有使用不同的線程進行接收,或者在收到呼叫前檢查數據是否可用(select)。