套接字异常:“端点映射器没有更多可用端点”

2023-11-22

我正在使用winsock 和C++ 来设置服务器应用程序。我遇到的问题是调用listen导致第一次机会异常。我想通常这些可以被忽略(?),但我发现其他人也有同样的问题,它导致应用程序偶尔挂起。任何帮助将不胜感激。

第一个机会例外是:

0x*12345678* 处的第一次机会异常MyApp.exe: 0x000006D9: 终结点映射器中不再有可用的终结点。

我发现一些证据表明这可能是由套接字引起的,我正在使用的代码如下。调用时发生异常listen在倒数第五行。

  m_accept_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (m_accept_fd == INVALID_SOCKET)
  {
    return false;
  }

  int optval = 1;

  if (setsockopt (m_accept_fd, SOL_SOCKET, SO_REUSEADDR,
                  (char*)&optval, sizeof(optval)))
  {
    closesocket(m_accept_fd);
    m_accept_fd = INVALID_SOCKET;
    return false;
  }

  struct sockaddr_in  local_addr;
  local_addr.sin_family = AF_INET;
  local_addr.sin_addr.s_addr = INADDR_ANY;
  local_addr.sin_port = htons(m_port);

  if (bind(m_accept_fd, (struct sockaddr *)&local_addr,
           sizeof(struct sockaddr_in)) == SOCKET_ERROR)
  {
    closesocket(m_accept_fd);
    return false;
  }

  if (listen (m_accept_fd, 5) == SOCKET_ERROR)
  {
    closesocket(m_accept_fd);
    return false;
  }

在非常繁忙的服务器上,您可能会用完套接字。您可能需要调整一些 TCPIP 参数。在注册表中调整这两项:

HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
   MaxUserPort  REG_DWORD  65534 (decimal)
   TcpTimedWaitDelay REG_DWORD 60 (decimal)

默认情况下,释放网络端口(套接字)和可以重新使用它之间有几分钟的延迟。此外,根据操作系统版本的不同,Windows 将使用的范围只有几千个。在服务器上,在命令提示符处运行以下命令:

网络统计-an

并查看结果(通过管道传输到文件是最简单的:netstat -an > netstat.txt)。如果您看到大量端口从 1025->5000 处于定时等待延迟状态,那么这就是您的问题,可以通过使用上面的注册表项将最大用户端口从 5000 调整到 65534 来解决。您还可以使用上面的注册表项来调整延迟,以更快地回收端口。

如果这不是问题,那么问题可能是您在 Listen() 方法中设置的挂起连接数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

套接字异常:“端点映射器没有更多可用端点” 的相关文章

随机推荐