[英]recvfrom() error 10035 using non-blocking sockets
我正在使用ioctlsocket()函數使我的套接字無阻塞但是當我調用recvfrom()時,我得到錯誤10035( WSAEWOULDBLOCK
)。
u_long mode = 1;
ioctlsocket(newSocketIdentifier, FIONBIO, &mode);
while(1)
{
if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
{
char err[128];
itoa(WSAGetLastError(),err,10);
MessageBox( NULL,"Could not Receive Data",err,MB_ICONINFORMATION);
BREAK;
}
}
任何人都可以解釋為什么會這樣嗎? :(
如果沒有可用數據,這是正常的。 代碼是WSAEWOULDBLOCK(參見此表)並且意味着,在阻塞端口上,該函數必須等待直到它可以被服務。
while(1)
{
if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(receiveBuffer), 0, (struct sockaddr *) &clientSocket, &clientSocketLength)) == SOCKET_ERROR)
{
int ierr= WSAGetLastError();
if (ierr==WSAEWOULDBLOCK) { // currently no data available
Sleep(50); // wait and try again
continue;
}
// Other errors
char err[128];
itoa(ierr,err,10);
MessageBox( NULL,"Could not Receive Data",err,MB_ICONINFORMATION);
break;
}
}
我不能同意這是“正常”,如上所述。
在您的recvfrom
調用中,您將收到recv_len
的錯誤。 我建議檢查該值 - 它將是SOCKET_ERROR
並通過調用WSAGetLastErrorenter
您將看到錯誤WSAEWOULDBLOCK
。
我不是(Windows)套接字專家,但根據我的測試,我不能使用ioctlsocket
和recvfrom
組合在非阻塞模式下通過UDP接收數據(我在你的例子中做了同樣的事情)。
我打算使用select
和recvfrom
組合,最小可能超時(1us)。 我現在還不知道任何其他可能更好的解決方案。
注意:您還應檢查ioctlsocket
的返回值ioctlsocket
存在可能的錯誤。
我今天晚些時候會提供我的代碼示例。
更新(按照承諾添加代碼):
/* define list of sockets for function select(..) */
fd_set readfds;
/* define timeout for function select(..) */
TIMEVAL tv;
/* timeout: 1us */
tv.tv_usec = 1;
/* timeout: 0s */
tv.tv_sec = 0;
/* just 1 socket is used */
readfds.fd_count = 1;
readfds.fd_array[0] = receivingSocket;
/* determine the status of one or more sockets with timeout */
int selectReturnValue = select(0, &readfds, 0, 0, &tv);
/* check return value of the call of function select(..) */
switch (selectReturnValue)
{
/* select(..) function timeout */
case 0:
/* time limit expired */
break;
/* select(..) function error */
case SOCKET_ERROR:
/* check the error status for the last windows sockets operation */
selectError(WSAGetLastError());
break;
/* no timeout and no error */
default:
/* receive data from UDP */
resultOfrecvfrom = recvfrom(receivingSocket, receivingBuffer, sizeof(receivingBuffer), 0, (SOCKADDR *)&serverReceptionInfo, &serverReceptionInfoLength);
/* check result of call of recvfrom(..) */
switch (resultOfrecvfrom)
{
/* connection has been gracefully closed */
case 0:
/* socket was closed */
break;
/* socket error occurred during last call of socket operation */
case SOCKET_ERROR:
/* check the error status for the last Windows Sockets operation */
recvfromError(WSAGetLastError());
break;
/* resultOfrecvfrom amount of data received */
default:
/* ... add your code here */
break;
}
break;
}
如果需要更多,我只是復制了我的代碼的關鍵部分,請在評論中告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.