gpt4 book ai didi

c++ - 如何检测端口是否已在服务器端使用(在 Windows 上的 C++ 中)?

转载 作者:行者123 更新时间:2023-11-28 01:25:20 26 4
gpt4 key购买 nike

这当然是一个常见问题,但不是这个术语(windows、服务器端、接受多连接)。

我的目标是仅当在此之前检测到端口“未使用”时,才接受在多个连接的端口上启动服务器列表。

在我放置 //HERE... 的那一行,bind 没有像我预期的那样返回 SOCKET_ERROR 状态。也许我做错了什么。

如何检测我的端口没有被其他应用使用?

这里是运行前端口的状态(已被使用)

netstat -an
TCP 127.0.0.1:2005 0.0.0.0:0 LISTENING

我希望这个片段足以解释我在做什么,它是几个步骤的合并。

WSADATA WSAData;
int err = WSAStartup(MAKEWORD(2, 2), &WSAData);

SOCKADDR_IN sin;
socklen_t recsize = sizeof(sin);
int one = 1;

SOCKADDR_IN* csin;
SOCKET csock = INVALID_SOCKET;
socklen_t crecsize = sizeof(SOCKADDR_IN);
int sock_err;

if (m_socket != INVALID_SOCKET)
{
memset(&sin, 0, recsize);
if(m_blocal)
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
else
sin.sin_addr.s_addr = htonl(INADDR_ANY);

sin.sin_family = AF_INET;
sin.sin_port = htons(m_iPort);

setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&one, sizeof(int));
sock_err = bind(m_socket, (SOCKADDR*)&sin, recsize);
//HERE I want to be sure no one else runs on this port

//rest of the code using: select(m_socket + 1, &rd, &wr, &er, &timeout);
}

closesocket(m_socket);
WSACleanup();

最佳答案

不要设置 SO_REUSEADDR。然后,如果地址已被使用,bind() 将失败,WSAGetLastError() 将返回 WSAEADDRINUSE

另请注意,如果 IP 地址不同,两个进程仍然可以绑定(bind)到同一端口,例如,一个进程绑定(bind)到 localhost,另一个进程绑定(bind)到 LAN 网络地址。

关于c++ - 如何检测端口是否已在服务器端使用(在 Windows 上的 C++ 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129031/

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