【问题标题】:WSAECONNABORTED when using recv for the second time第二次使用 recv 时 WSAECONNABORTED
【发布时间】:2010-12-28 21:46:17
【问题描述】:

我正在编写一个由两个应用程序组成的 2D 多人游戏,一个控制台服务器和一个窗口客户端。到目前为止,客户端有一个 FD_SET,里面装满了连接的客户端、我的游戏对象指针列表和其他一些东西。在 main() 中,我初始化侦听套接字并创建三个线程,一个用于接受传入连接并将它们放在 FD_SET 中,另一个用于处理对象的位置、速度和加速度并将它们(如果需要)标记为那些必须在客户端上更新。第三个线程使用 send() 函数发送每个对象的更新信息(遍历对象指针列表)。这样的数据包由操作码、数据包大小和实际数据组成。在客户端上,我通过读取正确接收的前 5 个字节(操作码和数据包大小)来解析它,但是当我想读取数据包的剩余部分时(因为我现在知道它的大小),我得到一个WSAECONNABORTED(错误代码 10053)。我已阅读有关此错误的信息,但不明白为什么它会出现在我的应用程序中。任何帮助将不胜感激。

【问题讨论】:

    标签: networking winsock


    【解决方案1】:

    错误意味着系统关闭了套接字。这可能是因为它检测到客户端已断开连接,或者因为它发送的数据多于您正在读取的数据。

    网络协议解析器通常需要大量工作才能使其健壮,而且您无法确定在一次 read() 中会获得多少数据,例如在您读取的第一个块中,您可能会获得比您的操作代码和数据包大小更多的信息,甚至可能会更少(例如,只有操作代码)。仔细检查您的失败案例中没有发生这种情况。

    【讨论】:

    • 我确保第一个 recv() 得到了 5 个字节。第一个 recv() 总是按预期工作,尽管第二个 recv() 总是失败并出现 10053 错误。起初,服务器在短时间内发送了许多数据包,但为了确保这不是 recv() 函数失败的原因,我将其更改为每 10 秒只发送一个数据包,因此这不是什么导致问题。
    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2011-11-09
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多