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

How to detect if a port is already in use server side (in C++ on windows)?

本文关键字:服务器端 上的 C++ windows 是否 何检测 检测      更新时间:2023-10-16

这当然是一个常见的问题,但不是用这个术语(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地址不同,两个进程仍然可以绑定到同一端口,例如,一个进程绑定到localhost,另一个进程则绑定到LAN网络地址。