多线程通信问题,当超过最大连接数时怎么让别的客户端无法连接服务器
现在我希望只能最多连接2个客户端,当服务端已经和2个客户端建立了连接,第3个客户端主动连接的时候,服务端不让他连接上。
有什么好的方法么?以下是我的代码,现在其实是让客户端连接上后,在强行关闭连接的。。。有没有办法根本就让客户端连接不上呢?
private Socket mySock;
private TcpListener tcpL;
private void waitConnect()
{
tcpL = new TcpListener(MyIP, m_nPort);
tcpL.Start();
while (tMainLoopFlag)
{
//int threadCount = m_listSockets.Count + 1;
//if (threadCount > 2)
// continue;//这里继续循环根本就没有阻止tcpL的监听,
mySock = tcpL.AcceptSocket();
if (mySock.Connected)
{
int threadCount = m_listSockets.Count + 1;
if (threadCount > 2)
{
byte[] bb = System.Text.Encoding.Default.GetBytes("Connect fails!");
mySock.Send(bb);
mySock.Shutdown(SocketShutdown.Both);
mySock.Close();
continue;//这样做的话会使该端口处于time_wait状态下
}
.
.
.//正常处理
.}
}
}
------解决方案--------------------
根本连不上不可能,只要你端口开着,其实你不用发送 Connect fails这个信息,直接Close()就行了
------解决方案--------------------
呵呵,弄明白楼主的意思了。
netstat中显示established状态是在你acceptsocket之前就完成了的,除非你关闭stop这个tcplistener,否则这个established状态一定会建议。
实际上,从异步连接的另外一种方式你也可以看出来:
因为acceptSocket是同步即阻塞的,有时候你不想阻塞,那么你可以先:
tcplistner.Pending()
来检查有没有等待的连接,实际上它检查的就是算是处于established状态的连接,呵呵。
所以你想阻止这个不可能……你也无需管它,等超时之后这个状态会自然会放弃。
如果你需要客户端不连接,那么你需要由客户端来解决这个问题。