Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
recvfrom()错误10035使用非阻塞套接字_C_Sockets_Visual Studio 2008_Networking_Error Handling - Fatal编程技术网

recvfrom()错误10035使用非阻塞套接字

recvfrom()错误10035使用非阻塞套接字,c,sockets,visual-studio-2008,networking,error-handling,C,Sockets,Visual Studio 2008,Networking,Error Handling,我正在使用ioctlsocket()函数使套接字不阻塞,但是当我调用recvfrom()时,我得到了错误10035(WSAEWOULDBLOCK) 有人能解释为什么会这样吗(如果没有可用的数据,这是正常的。代码为WSAEWOULDBLOCK(请参阅此表),这意味着,在阻塞端口上,函数必须等待,直到可以提供服务 while(1) { if((recv_len = recvfrom(newSocketIdentifier, receiveBuffer, sizeof(rece

我正在使用ioctlsocket()函数使套接字不阻塞,但是当我调用recvfrom()时,我得到了错误10035(
WSAEWOULDBLOCK


有人能解释为什么会这样吗(

如果没有可用的数据,这是正常的。代码为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\u len
中收到一个错误。我建议检查该值-它将是
SOCKET\u error
,通过调用
WSAGetLastErrorenter
您将看到错误
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;
      }
   }
我不是(Windows)套接字专家,但根据我的测试,我不能使用
ioctlsocket
recvfrom
的组合来在非阻塞模式下通过UDP接收数据(我做了与您示例中相同的事情)

我计划结合使用
select
recvfrom
,并尽可能缩短超时时间(1us)。我现在不知道还有其他更好的解决方案

注意:您还应该检查
ioctlsocket
的返回值是否存在可能的错误

今天晚些时候我将提供我的代码示例

更新(按承诺添加代码):


我只是复制了代码的关键部分,如果需要更多,请在注释中告诉我。

I/O调用可能会失败。您确定使套接字非阻塞成功吗?如果当前没有可用数据,您将在非阻塞套接字上获得WSAEWOULDBLOCK。这是正常行为。感谢您的响应,但我知道客户端正在不断读取从文本文件发送数据并通过套接字发送,那么为什么没有可读取的数据?:(您的任何短循环都会比通过网络到达的数据包快。如果您获得WSAEWOULDBLOCK,只需将循环休眠几毫秒(例如,sleep(50))并继续。非常感谢。它现在正在使用sleep()s但您认为这是一个好方法吗?最初,我使用WSAWaitforMultipleEvents()调用recvfrom(),只有当FD_READ事件可用时。我认为它类似于非阻塞套接字,但后来有人给了我使用ioctlsocket()的想法。睡眠是一个笨拙的解决方案。通常您使用select()(或者WSAWaitforMultipleEvents())等待可用数据,然后尝试读取。或者使用阻塞套接字,以尽可能好的方式等待。非常感谢所有帮助:)
/* 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;      
}