C++ 如何检测端口是否已在服务器端使用(在windows上的C+;+;中)?
这当然是一个常见的问题,但不是用这个术语(windows、服务器端、接受多连接) 我的目标是,仅当在此之前检测到端口“未使用”时,才接受在端口上为多个连接启动服务器列表 在我把C++ 如何检测端口是否已在服务器端使用(在windows上的C+;+;中)?,c++,windows,sockets,networking,server,C++,Windows,Sockets,Networking,Server,这当然是一个常见的问题,但不是用这个术语(windows、服务器端、接受多连接) 我的目标是,仅当在此之前检测到端口“未使用”时,才接受在端口上为多个连接启动服务器列表 在我把//放在这里的那行…,bind没有像我预期的那样返回SOCKET\u错误状态。 也许我做错了什么 如何检测我的端口未被其他应用程序使用 以下是端口在运行前的状态(已使用) 我希望这个片段足以解释我在做什么,它是几个步骤的合并 WSADATA WSAData; int err = WSAStartup(MAKEWORD(2,
//放在这里的那行…
,bind
没有像我预期的那样返回SOCKET\u错误
状态。
也许我做错了什么
如何检测我的端口未被其他应用程序使用
以下是端口在运行前的状态(已使用)
我希望这个片段足以解释我在做什么,它是几个步骤的合并
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();
不要设置
,以便重新使用EADDR
。然后,如果地址已在使用中,bind()
将失败,WSAGetLastError()
将返回WSAEADDRINUSE
另请注意,如果IP地址不同,两个进程仍可绑定到同一端口,例如,一个进程绑定到
localhost
,另一个进程绑定到LAN网络地址。不要设置,因此请重新使用EADDR
。然后,如果地址已在使用中,bind()
将失败,WSAGetLastError()
将返回WSAEADDRINUSE
还请注意,如果IP地址不同,两个进程仍然可以绑定到同一端口,例如,一个进程绑定到
localhost
,另一个进程绑定到LAN网络地址。我认为所以\u REUSEADDR
可以在同一端口上重新侦听(例如,对于多个输入连接)。在第一次连接时没有任何效果。使用套接字,您可以bind()
一次,然后您可以accept()
一个或多个连接accept()
返回用于通信的新套接字SO\u REUSEADDR
允许不同的进程bind()
到同一个端口,而这通常不是您想要或应该做的。我认为SO\u REUSEADDR
能够在同一端口上重新侦听(比如,多个输入连接)。在第一次连接时没有任何效果。使用套接字,您可以bind()
一次,然后您可以accept()
一个或多个连接accept()
返回用于通信的新套接字SO_REUSEADDR
允许不同的进程bind()
到同一个端口,这通常不是您想要或应该做的。可能有一个解决方案是一个虚拟客户端,它尝试在本地主机上连接,但在acknoledgement上取消?可能有一个解决方案是一个虚拟客户端,它尝试在本地主机上连接,但在acknoledgement上取消?
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();