繁体   English   中英

10038套接字错误

[英]10038 socket error

10038服务器错误是否有任何解决方案.i已在c ++中完成编码; 服务器运行良好10到12小时,但很容易出现10038套接字错误

没有看到你的代码:你描述的症状听起来像你正在泄漏内存/资源,即你忘记释放/删除你正在分配的对象。 这也可能是一个时间问题。 我建议你发布你的(缩减)代码。

10038(WSAENOTSOCK):非插槽上的套接字操作。 尝试对不是套接字的操作进行操作。 套接字句柄参数未引用有效套接字,或者对于select,fd_set的成员无效。

我打赌你正在访问已经关闭的套接字。 这是WinSock编程中一个非常常见的时间错误 - 好消息(和坏消息,因为它很难重现)是你不经常打它,所以你的代码可能不需要太多的工作来完善它。 我认为你应该添加线程安全的诊断,在每次打开和关闭时,以及从你看到10038或其他意外错误的任何地方输出包含套接字值(基本上是int )的字符串。

如果你可以添加这些诊断,然后设置一个压力测试,专注于程序中的打开和关闭区域(你可能需要将代码拆分为一个小的子集,用于单元测试套接字处理,也许这样做可以回到 - 在本地主机或两台连接局域网的机器上然后它可能会比10-12小时更快地显示,你可以找到并修复其他时间窗口。 目标是尝试将10-12小时的“正常”套接字活动压缩到尽可能小的时间空间,以真正暴露任何难以检测的并发问题。

这可能有两个原因:

  1. 您的套接字描述符未初始化(即不引用有效的套接字)。
  2. 你关闭了这个套接字(通过调用closesocket ),仍然尝试使用它。

这样的错误总是一个错误 ,它与真实的网络活动/状态等无关。这在某种意义上是等同于在释放资源/内存之后尝试使用资源/内存,或者只是引用未初始化的指针。

因此,为了解决10038,您必须修复代码。

PS如果你有一个多线程应用程序 - 很可能你在一个线程中关闭套接字,而另一个线程仍然试图使用它。

无论如何,在开头将套接字描述符初始化为INVALID_SOCKET是一个很好的做法。 关闭后立即将其设置为INVALID_SOCKET

然后,在尝试使用它之前,您可以检查套接字是否有效。 通过这种方式,您可能会发现有问题的情况。

还要注意这样的事实 - 至少在Windows中 - 如果你尝试在一个在不同线程中打开的线程上发送套接字,你将得到10038。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM