10038套接字错误

时间:2010-10-16 08:32:21

标签: c++ visual-c++ sockets

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

4 个答案:

答案 0 :(得分:11)

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

  

10038(WSAENOTSOCK):非插槽上的套接字操作。操作   曾尝试过的不是   一个插座。套接字句柄   参数没有引用有效   套接字,或用于选择,一个成员   fd_set无效。

答案 1 :(得分:7)

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

如果您可以添加这些诊断,然后设置一个压力测试,专注于程序中的打开和关闭区域(您可能需要将代码拆分为一小部分,以便对插槽处理进行单元测试,也许这样做然后它可能会显示出比10-12小时更快的表现,并且你可能会发现并修复其他计时窗口。目标是尝试将10-12小时的“正常”套接字活动压缩到尽可能小的时间空间,以真正暴露任何难以检测的并发问题。

答案 2 :(得分:6)

这可能有两个原因:

  1. 未初始化的套接字描述符(即不引用有效的套接字)。
  2. 您已关闭此套接字(通过调用closesocket),但仍尝试使用它。
  3. 这样的错误始终是错误,它与真实的网络活动/状态等无关。这相当于(在某种意义上)尝试使用资源/内存之后释放它,或者只是引用一个未初始化的指针。

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

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

    无论如何,最好将套接字描述符初始化为INVALID_SOCKET。关闭后立即将其设置为INVALID_SOCKET

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

答案 3 :(得分:0)

另外请注意以下事实 - 至少在Windows中 - 如果您尝试在一个在不同线程中打开的线程上发送套接字,您将获得10038。