【发布时间】:2017-11-10 02:17:34
【问题描述】:
10038 服务器错误有什么解决方案吗?我已经用 C++ 编写过代码; 服务器运行良好 10 到 12 小时,但突然出现 10038 套接字错误
【问题讨论】:
标签: c++ visual-c++ sockets
10038 服务器错误有什么解决方案吗?我已经用 C++ 编写过代码; 服务器运行良好 10 到 12 小时,但突然出现 10038 套接字错误
【问题讨论】:
标签: c++ visual-c++ sockets
没有看到您的代码:您描述的症状听起来像是您正在泄漏内存/资源,即您忘记释放/删除正在分配的对象。这也可能是时间问题。我建议您发布您的(缩减的)代码。
10038 (WSAENOTSOCK):非套接字上的套接字操作。 操作 尝试过的东西不是 一个插座。无论是插座手柄 参数没有引用有效的 套接字,或者对于选择,一个成员 fd_set 无效。
【讨论】:
我打赌你正在访问一个你已经关闭的套接字。这是 WinSock 编程中非常常见的计时错误 - 好消息(也有坏消息,因为它很难重现)是您不会经常遇到它,因此您的代码可能不需要太多工作即可使其完美。我认为你应该添加线程安全诊断,在每次打开和关闭时输出一个字符串,包括套接字值(基本上是int),以及从任何你看到这个 10038 或其他意外错误的地方。
如果您可以添加这些诊断,然后设置压力测试,重点关注程序中的打开和关闭区域(您可能需要将代码剥离到一个小的子集以对套接字处理进行单元测试,也许这样做在 localhost 或两台 LAN 连接的机器上背靠背),那么它可能会比 10-12 小时更快地显现出来,您可能会在此过程中找到并修复其他时间窗口。目标是尝试将 10-12 小时的“正常”套接字活动压缩到尽可能小的时间空间中,以真正暴露任何难以检测的并发问题。
【讨论】:
这可能有两个原因:
closesocket),但仍尝试使用它。这样的错误总是一个错误,它与真实的网络活动/状态等无关。这相当于(在某种意义上)在你尝试使用资源/内存之后释放它,或者只是引用一个未初始化的指针。
所以为了解决 10038 你必须修复你的代码。
附:如果您有一个多线程应用程序 - 很可能您在一个线程中关闭了套接字,而另一个线程仍在尝试使用它。
无论如何,在开头将套接字描述符初始化为INVALID_SOCKET 是一个很好的做法。关闭后立即将其设置为INVALID_SOCKET。
然后,在尝试使用它之前,您可以检查套接字是否有效。这样,您可能会发现有问题的场景。
【讨论】:
还要注意以下事实——至少在 Windows 中——如果您尝试在一个线程上的套接字上发送,而该线程在另一个线程中打开。
【讨论】: