UDP套接字上的recvfrom()返回-1,但WSAGetLastError()返回0

时间:2011-05-17 15:41:56

标签: c++ sockets

我似乎无法弄清楚为什么会这样。我没有使用任何可以调用WSAGetLastError()的套接字库,因为我只在Windows平台上使用C套接字函数。我使用select()来管理多个UDP套接字,所以也许这与它有关。这是正在发生的事情:

我有许多UDP套接字,我使用fd_set注册,并使用select()仅在读取操作可用时进行检查。我遍历所有套接字并检查FD_ISSET()以确保读取操作可用。然后我调用recvfrom(),这似乎在大多数时间都有效,但偶尔当其中一个套接字上有一系列活动时,recvfrom()将返回-1。当我对WSAGetLastError()进行后续调用时,它返回0(这是我整个应用程序中对WSAGetLastError的唯一调用)。如果我忽略错误,套接字继续正常运行。它能够回收数据并做其事。这很奇怪。

我知道UDP套接字可能返回0(一个有效的空UDP数据包),这不是TCP(干净关闭)的情况,但是-1也可能正常吗?我想也许这可能是由某种并发问题引起的,其中一个线程可能在套接字上执行sendto()而recvfrom()正在被调用的过程中,所以我添加了一个互斥锁以防止这种情况发生(但行为仍然存在)。

我对整个事情感到很困惑,所以任何建议或帮助都会非常感激。也许select()为读取操作添加了套接字,而这些操作确实不是读取操作?我非常确定TCP会对侦听套接字上的连接请求执行此操作。

我在Visual Studio 2010中使用C ++作为我的编译器和IDE。这是一个没有MFC或任何废话的控制台应用程序。

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,-1是SOCKET_ERROR,所以no:-1永远不是正常值。我见过这个错误的唯一另一次是当你在TCP套接字上使用accept但是在你调用recv的同一套接字上调用accept时,而不是返回值accept致电。您确定在正确的套接字上调用失败的recvfrom吗?