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

标签 c sockets visual-studio-2008 networking error-handling

我正在使用 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;
      }
   }

关于c - recvfrom() 错误 10035 使用非阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17064069/

相关文章:

java - 如何测量丢弃的UDP消息数?

c - 如何在 c ( linux ) 中同时识别来自多个键的输入

c++ - printf 中的优先级似乎发生了变化

c - 为什么父进程死亡会杀死子进程

c# - 如何使用微框架正确更改静态 IP 地址?

visual-studio - 有没有办法让 Resharper 修复文件上的所有内容(使用第一个选项)

c - 从文件 c 中读取多位整数

c - C 中的强制转换结构中的段错误

c++ - 汇编代码与我的 C++ 代码混合在一起。如何移植到 64 位

c# - 调试 DLL 的发布版本(使用 PDB 文件)