日期:2014-05-18  浏览次数:21167 次

多线程通信问题,当超过最大连接数时怎么让别的客户端无法连接服务器
现在我希望只能最多连接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状态的连接,呵呵。

所以你想阻止这个不可能……你也无需管它,等超时之后这个状态会自然会放弃。
如果你需要客户端不连接,那么你需要由客户端来解决这个问题。