gpt4 book ai didi

c++ - 套接字异常 : "There are no more endpoints available from the endpoint mapper"

转载 作者:可可西里 更新时间:2023-11-01 18:26:06 26 4
gpt4 key购买 nike

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

第一次机会异常是:

First-chance exception at 0x*12345678* in MyApp.exe: 0x000006D9: There are no more endpoints available from the endpoint mapper.

我发现了一些证据表明这可能是由套接字引起的我正在使用的代码如下。异常发生在倒数第五行调用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 将使用的范围内只有几千个。在服务器上,在命令提示符下运行:

netstat -an

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

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

关于c++ - 套接字异常 : "There are no more endpoints available from the endpoint mapper",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/272523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com