【问题标题】:C++ Winsock recv not blockingC++ Winsock recv 不阻塞
【发布时间】:2012-06-17 00:39:10
【问题描述】:

我正在用 c++ 开发服务器,当我在 while 循环中使用 recv() 时,它返回所有时间长度 -1 并且继续循环而不阻塞。

while(true)
{
   char buffer[1024];
   int dataLength =  recv(socket, buffer, 1024, 0)
   cout << dataLength;
}

输出:-1-1-1-1-1-1-1-1-1.............

有谁知道如何让这个套接字阻塞直到它接收到数据?

提前致谢!

【问题讨论】:

  • WSAGetLastError 返回什么?
  • 在下面答案给出的线程的帮助下,我设法打印出 WSAGetLastError 并返回 10057
  • WSAENOTCONN 10057 (0x2749) A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied. - System Error Codes - 学会爱他们。
  • 谢谢,但我使用的是 tcp 和数据报套接字;s udp 否?我的套接字是这样构造的 Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);。顺便说一句,客户端在 c# 中使用 TcpClient 可能存在竞争问题?
  • 因为这是一个服务器套接字,你必须调用accept(),然后你在accept()返回的SOCKET上调用recv()。不要在收听SOCKET时打电话给recv()

标签: c++ winsock


【解决方案1】:

可能在初始化过程中出现错误 尝试调用 GetLastError() 并在每次调用后打印结果

【讨论】:

    【解决方案2】:

    按照 James 的建议,检查是否发生了套接字错误。 recv()s 默认行为是阻止。也可以在这里查看this thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多