【问题标题】:Windows 2003 server socket error 10055Windows 2003 服务器套接字错误 10055
【发布时间】:2011-06-16 06:21:18
【问题描述】:

我在 Windows 2003 服务器上运行了一个非常大的应用程序。它创建了近 900 个线程和一个在套接字上运行的单个线程。这是我用 Visual Studio 环境编译的 C++ 应用程序。

经过将近 17-20 小时的测试,我在发送数据时收到 10055 套接字错误。 除了这个错误之外,我的应用程序运行良好,没有任何错误或问题。这是一个四核系统,具有 4 GiB 的 RAM,并且此应用程序在其所有运行过程中占用大约 30-40% 的 CPU(在所有 4 个 CPU 上)。

这里的任何人都可以帮我解决这个问题。我几乎在谷歌上搜索了有关此错误的所有内容,但找不到与我的案例相关的任何内容。

【问题讨论】:

    标签: winapi winsock


    【解决方案1】:

    我认为,不可能说比:

    错误 10055 表示 Windows 已运行 TCP/IP 套接字缓冲区不足,因为 一次打开的连接太多。

    http://kbase.pscs.co.uk/index.php?article=93

    https://wiki.pscs.co.uk/how_to:10055

    【讨论】:

      【解决方案2】:

      我以前在 IOCP 套接字系统中看到过这种症状。我必须限制传出的异步套接字发送,以便没有太多数据在内核中排队等待在套接字上发送。

      虽然错误文本说这是由于连接数造成的,但这不是我的经验。如果您编写了一个紧密循环,在单个套接字上执行异步发送,没有节流,您可以很快达到这个目标。

      @Len Holgate 可能在这里要补充一些东西,他是我解决 Windows 套接字问题的“goto guy”。

      【讨论】:

      • 嗨@Steve Townsend,我无法正确解释您的解决方案。即使我知道我的问题是因为没有。连接数(因为我在应用程序的整个生命周期中只使用连接),尽管我创建了很多不。用于其他一些考虑的线程。因此,您怀疑内存缓冲区被填充肯定是一些问题。你能给我更多的指针,我可以开始寻找这个。
      • @Len Holgate 你能帮帮我吗?我仍然无法解决这个问题。我还尝试使用 TCP_NO_DELAY 使其能够尽快发送数据,但这个问题仍然存在.
      【解决方案3】:
       It creates almost 900 threads
      

      部分是你的问题。每个线程都可能使用默认的 1MB 堆栈。您开始接近 GB 的线程开销。内存不足的可能性很高。使用 IOCP 的全部意义在于您不必创建“每个连接的线程”。您可以创建多个线程(CPU 数量的 1 倍至 4 倍)来侦听完成端口处理程序,并让每个线程为不同的请求提供服务,以最大限度地提高可扩展性。

      我记得在 Stack Overflow 上读过一篇链接的文章,其中设置了您为挂起的 IOCP 操作发布的缓冲区,以便操作系统不会让内存从物理内存换出到磁盘。然后,当连接数变高时,您可能会耗尽系统资源。

      如果我没记错的话,解决方法是为每个套接字连接发布一个 0 字节缓冲区(或者是 1 字节缓冲区)。当数据到达时,您的完成端口处理程序将返回,这是您的代码发布更大缓冲区的提示。如果我能找到链接,我会分享它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多