10038套接字错误

Sun*_*i86 4 c++ sockets visual-c++

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

Mit*_*eat 11

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

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

  • downvoters请发表评论. (6认同)

Ste*_*end 8

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

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


val*_*ldo 6

这可能有两个原因:

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

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

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

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

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

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