我正在使用winsock和C++来设置服务器应用程序.我遇到的问题是调用listen
导致第一次机会异常.我猜通常这些可以被忽略(?)但是我发现其他人有同样的问题我在哪里导致应用程序偶尔挂起一次.任何帮助将不胜感激.
第一次机会例外是:
MyApp .exe 中0x*12345678*的第一次机会异常:0x000006D9:端点映射器不再提供端点.
我发现一些证据表明这可能是由socket引起的.我正在使用的代码如下所示.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; }
Darian Mille.. 6
在非常繁忙的服务器上,您可能正在耗尽套接字.您可能需要调整一些TCPIP参数.在注册表中调整这两个:
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters MaxUserPort REG_DWORD 65534 (decimal) TcpTimedWaitDelay REG_DWORD 60 (decimal)
默认情况下,释放网络端口(套接字)与何时可以重用之间会有几分钟的延迟.此外,根据操作系统版本,Windows将使用的范围中只有几千个.在服务器上,在命令提示符下运行:
netstat -an
并查看结果(管道到文件最简单:netstat -an> netstat.txt).如果您在Timed Wait Delay状态下看到1025-> 5000的大量端口,那么这就是您的问题,并通过使用上面的注册表项将最大用户端口从5000调整到65534来解决.您还可以使用上面的注册表项来更快地回收端口来调整延迟.
如果这不是问题,则问题可能是您在Listen()方法中设置的挂起连接数.
在非常繁忙的服务器上,您可能正在耗尽套接字.您可能需要调整一些TCPIP参数.在注册表中调整这两个:
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters MaxUserPort REG_DWORD 65534 (decimal) TcpTimedWaitDelay REG_DWORD 60 (decimal)
默认情况下,释放网络端口(套接字)与何时可以重用之间会有几分钟的延迟.此外,根据操作系统版本,Windows将使用的范围中只有几千个.在服务器上,在命令提示符下运行:
netstat -an
并查看结果(管道到文件最简单:netstat -an> netstat.txt).如果您在Timed Wait Delay状态下看到1025-> 5000的大量端口,那么这就是您的问题,并通过使用上面的注册表项将最大用户端口从5000调整到65534来解决.您还可以使用上面的注册表项来更快地回收端口来调整延迟.
如果这不是问题,则问题可能是您在Listen()方法中设置的挂起连接数.