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

C++ 如何检测端口是否已在服务器端使用(在windows上的C+;+;中)?,c++,windows,sockets,networking,server,C++,Windows,Sockets,Networking,Server,这当然是一个常见的问题,但不是用这个术语(windows、服务器端、接受多连接) 我的目标是,仅当在此之前检测到端口“未使用”时,才接受在端口上为多个连接启动服务器列表 在我把//放在这里的那行…,bind没有像我预期的那样返回SOCKET\u错误状态。 也许我做错了什么 如何检测我的端口未被其他应用程序使用 以下是端口在运行前的状态(已使用) 我希望这个片段足以解释我在做什么,它是几个步骤的合并 WSADATA WSAData; int err = WSAStartup(MAKEWORD(2,

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

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

在我把
//放在这里的那行…
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();