2011-10-05 45 views
1

我的TCPListener配置是这样的:的TCPListener蓝调,想不通为什么连接不正确关闭

this.tcpListener = new TcpListener(IPAddress.Any, config.portNum); 

然后我(使用线程)设置一个监听器函数是这样的:

private void ListenForClients() 
    { 
     this.tcpListener.Start(); 

     while (true) 
     { 
     //blocks until a client has connected to the server 
     TcpClient client = this.tcpListener.AcceptTcpClient(); 

     //create a thread to handle communication 
     //with connected client 

     ThreadStart starter = delegate { HandleClientComm(client, this.DBGrid); }; 
     Thread thread = new Thread(starter); 
     thread.Start(); 
     } 
    } 

围绕它的作品第一次,第二次我火了,我得到这个错误信息:

每个套接字地址(协议/网络地址/端口)的一个用法通常 允许

线程里面有一个叫关闭:

tcpClient.Close(); 

但它似乎并没有释放该端口了,有什么建议?

+0

您获得这种怀疑的特定代码行是什么? – user957902

+0

this.tcpListener.Start();第二次造成问题。 –

+1

您是否在同一个进程中多次调用tcpListener.Start,或者一旦关闭了进程并重新启动它,就会出现错误? – user957902

回答

2

如果您反复打电话给ListenForClients,那是您问题的根源,而不是客户端连接不正确Close()

传统上,一个线程将处理打开主套接字并接受“子”连接套接字。所以你的ListenForClients应该在主服务器线程中,并且每个应用程序只调用一次。

一些更多的信息:

this.tcpListener.Start(); 

创建在你指定的端口狠狠地聆听。随着每一个客户端连接,

TcpClient client = this.tcpListener.AcceptTcpClient(); 

线将创建连接,是一个完全不同的端口上的一个新的插座。所以通过关闭你的客户端,你根本不会释放主套接字。提供应用服务

http://en.wikipedia.org/wiki/Internet_socket#Socket_states_and_the_client-server_model

计算机过程被称为服务器,创建启动时是处于监听状态套接字。这些套接字正在等待来自客户端程序的计划。对于侦听的TCP套接字,由netstat表示的远程地址可以表示为0.0.0.0,远程端口号为0.

TCP服务器可以同时为多个客户端提供服务,方法是为每个客户端创建子进程并建立TCP子进程和客户端之间的连接。为每个连接创建独特的专用套接字。当通过远程套接字建立套接字 - 虚拟连接或虚拟电路(VC)(也称为TCP会话)时,这些处于建立状态,从而提供双工字节流。

2

问题出在tcpListener.Start()。您不允许在同一个端口上拥有2个侦听器。 ListenForClients方法只能在您的应用程序中调用一次