Winsock2:如何在VC++中使用listen的backlog一次只允许一个客户端连接

imm*_*mmi 3 c++ winsock winsock2 visual-c++

我想从我的TCP服务器一次只允许一个连接.你能告诉我,如何使用没有积压长度为零的听力.

我正在使用代码(如下所示),但是当我逐个启动2个客户端时,两者都会连接起来.我使用VC++和winsock2.

听(m_socket,-1);

因积压而传递零也无法正常工作.

等待你的回复.

问候,
immi

War*_*ung 7

如果您确实可以将应用程序限制为仅使用Winsock 2,则可以使用其条件接受机制:

SOCKET sd = socket(...);
listen(sd, ...);
DWORD nTrue = 1;
setsockopt(sd, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (char*)&nTrue, sizeof(nTrue));
Run Code Online (Sandbox Code Playgroud)

只要连接积压空间可用,这就会更改堆栈的行为,以便不会自动向传入的SYN数据包发送SYN-ACK回复.相反,你的程序得到它应该正常接受连接的信号 - select(),WSAEventSelect(),WSAAsyncSelect()... - 然后你调用WSAAccept()而不是accept():

sockaddr_in sin;
WSAAccept(sd, (sockaddr*)&sin, sizeof(sin), ConditionalAcceptChecker, 0);
Run Code Online (Sandbox Code Playgroud)

您编写函数ConditionalAcceptChecker()来查看传入的连接信息并决定是否接受连接.在您的情况下,CF_REJECT只要您已经处理连接,就可以返回.

再次,请注意此机制是特定于Winsock 2.如果您需要可移植行为,其他帖子建议在程序已经连接时关闭侦听套接字更好.