imm*_*mmi 3 c++ winsock winsock2 visual-c++
我想从我的TCP服务器一次只允许一个连接.你能告诉我,如何使用没有积压长度为零的听力.
我正在使用代码(如下所示),但是当我逐个启动2个客户端时,两者都会连接起来.我使用VC++和winsock2.
听(m_socket,-1);
因积压而传递零也无法正常工作.
等待你的回复.
问候,
immi
如果您确实可以将应用程序限制为仅使用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.如果您需要可移植行为,其他帖子建议在程序已经连接时关闭侦听套接字更好.
| 归档时间: |
|
| 查看次数: |
2365 次 |
| 最近记录: |