套接字异常:";“端点映射器”中没有更多可用的端点; < >我使用Winsock和C++来建立服务器应用程序。我遇到的问题是,调用listen会导致第一次出现异常。我想通常这些都可以忽略(?),但我发现其他人也有同样的问题,有时会导致应用程序挂起。任何帮助都将不胜感激

套接字异常:";“端点映射器”中没有更多可用的端点; < >我使用Winsock和C++来建立服务器应用程序。我遇到的问题是,调用listen会导致第一次出现异常。我想通常这些都可以忽略(?),但我发现其他人也有同样的问题,有时会导致应用程序挂起。任何帮助都将不胜感激,c++,exception,sockets,winsock,rpc,C++,Exception,Sockets,Winsock,Rpc,第一个例外是: MyApp.exe中0x*12345678*处的首次偶然异常:0x000006D9:终结点映射程序中没有更多可用的终结点 我发现一些证据表明这可能是由套接字引起的,我正在使用的代码如下所示。调用底部第五行中的listen时发生异常 m_accept_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_accept_fd == INVALID_SOCKET) { return false; }

第一个例外是:

MyApp.exe中0x*12345678*处的首次偶然异常: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;
  }

<>这不会直接回答你的问题,但是既然你使用C++,我建议使用一些类似于处理你的套接字代码的东西。这为您提供了对winsock API的良好抽象,并应允许您更轻松地诊断错误情况。

Uhh,可能是因为您大大限制了传入连接的最大数量

listen (m_accept_fd, 5)
// Limit here       ^^^
如果您允许更多的积压工作,您应该能够处理您的问题。使用SOMAXCONN之类的工具,而不是5


此外,如果您的问题仅出现在服务器启动时,您可能希望关闭LINGER(SO_LINGER),以防止连接挂起并阻塞套接字…

您是否确实看到问题,例如,程序是否因未处理的异常而结束


即使没有问题,调试器也可能打印消息,例如,请参阅

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

HKLM\System\CurrentControlSet\Services\Tcpip\Parameters
   MaxUserPort  REG_DWORD  65534 (decimal)
   TcpTimedWaitDelay REG_DWORD 60 (decimal)
默认情况下,从释放网络端口(套接字)到重新使用它之间有几分钟的延迟。此外,根据操作系统版本的不同,windows将使用的范围只有几千个。在服务器上,在命令提示符下运行此命令:

netstat-an

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


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

最初的问题与winsock无关。以上所有答案都是错误的。忽略first chance异常,这不是应用程序的问题,只是一些内部错误处理。

此侦听是否仅在启动时执行?端口是您绑定到dynamic的吗?您一次监听多少端口?切换到SOMAXCONN没有帮助,但这肯定是我将随身携带的提示。徘徊者也没有帮助:-(