如何检测端口是否已在服务器端使用(在windows上的C++中)
How to detect if a port is already in use server side (in C++ on windows)?
这当然是一个常见的问题,但不是用这个术语(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网络地址。
相关文章:
- C/C++ Linux 上的多线程服务器/客户端崩溃
- 使用 WebGL 使用 qml 访问客户端上的文件
- 如何使用 WIN RPC 发送终止的字符数组(用于将图像从客户端上传到服务器)
- 无法在java(客户端)的套接字上正确写入数据(类),也无法在c ++(服务器)上读取数据(类)
- 服务器编译器上的VS C 编译器免费许可证
- 如何检测端口是否已在服务器端使用(在windows上的C++中)
- C [UDP]如何跟踪服务器上的所有连接(客户端)套接字连接
- 从 SharePoint 2010 服务器下载,在 Windows 客户端上的本地应用程序中打开
- Linux服务器和Windows客户端上的C 源代码
- 服务器客户端程序上的QT-QFileSystemModel
- 正在比较服务器端收到的字符串-C++
- 如何在boostc++中添加http服务器端口的路径
- 服务器关闭时,客户端上的 ASIO 写入操作被阻止
- 无法在C++中将数据从服务器发送到本地网络上的客户端
- 将 c# asp.net Web 应用程序与C++ dll 链接时,是在服务器或客户端上运行的 dll 代码
- gSoap:如何在Qt中设置或更改客户端上的cookie
- zeromq: PULL/PUSH客户端在连接31后崩溃.windows上的服务器
- 在c#客户端上接收来自c++服务器的数据
- C / c++代码与服务器(tomcat)上的远程web服务通信
- 2 个本地服务器(C++上的逻辑服务器和用于网页的 Web 服务器)数据交换.如何