對於TCP阻塞套接字,它是安全調用:recv傳入0來檢測套接字錯誤是否安全?
if(SOCKET_ERROR != recv(s, NULL, 0, 0))
//...
檢測錯誤?
我認爲這是安全的,那麼我有一個計算機上的情況,它掛在這個聲明。 (如果重要的話,使用ssl套接字)。我也嘗試傳遞MSG_PEEK標誌與指定的緩衝區,但我也有一個掛在那裏。
什麼是替代方案?
對於TCP阻塞套接字,它是安全調用:recv傳入0來檢測套接字錯誤是否安全?
if(SOCKET_ERROR != recv(s, NULL, 0, 0))
//...
檢測錯誤?
我認爲這是安全的,那麼我有一個計算機上的情況,它掛在這個聲明。 (如果重要的話,使用ssl套接字)。我也嘗試傳遞MSG_PEEK標誌與指定的緩衝區,但我也有一個掛在那裏。
什麼是替代方案?
除了其他的答案 - 這裏有一個方便的小功能,讓懸而未決的套接字錯誤:
/* 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;
}
你確實說過你正在使用阻塞套接字,但你應該使用select來代替(即使你在select選擇調用之前將它設置爲unblocking)。它允許您輪詢文件描述符並查看是否有數據等待,或者是否有錯誤。
呼叫本身是「安全」的,因爲它應該作爲documented工作,但是您必須認識到recv
是阻止接收呼叫。這意味着該調用將阻塞正在執行的線程,直到數據到達套接字。這可能會導致您的應用程序「掛起」,如果您沒有使用不同的線程進行接收,或者在收到呼叫前檢查數據是否可用(select)。
我在Windows上,如果該事項。 – 2009-07-09 12:06:38