10038服务器错误是否有任何解决方案.i已在c ++中完成编码; 服务器运行良好10到12小时,但很容易产生10038套接字错误
答案 0 :(得分:11)
没有看到你的代码:你描述的症状听起来就像你正在泄漏内存/资源,即你忘记释放/删除你正在分配的对象。这也可能是一个时间问题。我建议您发布(缩减)代码。
10038(WSAENOTSOCK):非插槽上的套接字操作。操作 曾尝试过的不是 一个插座。套接字句柄 参数没有引用有效 套接字,或用于选择,一个成员 fd_set无效。
答案 1 :(得分:7)
我打赌你正在访问已经关闭的套接字。这是WinSock编程中一个非常常见的时间错误 - 好消息(和坏消息,因为它很难重现)是你不经常打它,所以你的代码可能不需要太多的工作来完善它。我认为你应该添加线程安全诊断,在每次打开和关闭时,以及从你看到10038或其他意外错误的任何地方输出包含套接字值(基本上为int
)的字符串。
如果您可以添加这些诊断,然后设置一个压力测试,专注于程序中的打开和关闭区域(您可能需要将代码拆分为一小部分,以便对插槽处理进行单元测试,也许这样做然后它可能会显示出比10-12小时更快的表现,并且你可能会发现并修复其他计时窗口。目标是尝试将10-12小时的“正常”套接字活动压缩到尽可能小的时间空间,以真正暴露任何难以检测的并发问题。
答案 2 :(得分:6)
这可能有两个原因:
closesocket
),但仍尝试使用它。这样的错误始终是错误,它与真实的网络活动/状态等无关。这相当于(在某种意义上)尝试使用资源/内存之后释放它,或者只是引用一个未初始化的指针。
因此,为了解决10038问题,您必须修复代码。
P.S。如果你有一个多线程应用程序 - 很可能你在一个线程中关闭套接字,而另一个线程仍在尝试使用它。
无论如何,最好将套接字描述符初始化为INVALID_SOCKET
。关闭后立即将其设置为INVALID_SOCKET
。
然后,在尝试使用它之前,您可以检查套接字是否有效。通过这种方式,您可能会发现有问题的情况。
答案 3 :(得分:0)
另外请注意以下事实 - 至少在Windows中 - 如果您尝试在一个在不同线程中打开的线程上发送套接字,您将获得10038。