2009-11-20 115 views
8

我有一个TcpClient对象,它使用底层的NetworkStream.Write()向服务器发送一些数据。为此 ,我有:关闭TCP连接的正确方法是什么

TcpClient server = new TcpClient(serverName, 50001); 

/* ... */ 

NetworkStream stream = server.GetStream(); 

现在,当按下一个按钮,连接应该关闭。 关闭连接的正确方法是什么? MSDN文档说,关闭TcpClient(使用.Close())实际上并不关闭套接字,只关闭TcpClient资源(这至少是我理解文档的方式)。

那么,会不会正确地关闭连接的下一个代码?

stream.Close(); 
server.Close(); 

难道这还不够,还是应该首先检查(在某种程度上)如果流(或服务器)可以关闭(如果连接是半开或东西)......

更,NetworkStream.Close() MSDN文档声明它释放资源(即使是套接字),所以也许关闭流就足够了,因为我阻止在那之后使用TcpClient。

什么是正确的方法?

回答

6

由于the docs说:

调用此方法将最终导致在相关插座的接近,也将关闭关联的NetworkStream用来发送和如果创建接收数据。

所以server.Close();就足够了。

首先关闭NetworkStream不会伤害。

顺便说一句,如果你碰巧是只有一个方法使用的TcpClient,它包装在一个using()语句,这样你肯定Dispose()(相当于Close())被调用就可以了,即使引发异常等。

+1

我想我太信任智能感知了。 TcpClient.Close()的弹出窗口声明:“放弃此System.Net.Sockets.TcpClient实例而不关闭底层连接。”奇怪的事情。感谢您的回复。 – 2009-11-20 09:26:51

+0

的确,这就是3.0文档(http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(VS.85).aspx)在第一句中所说的......但接着第三句说它*关闭Socket和NetworkStream。 3.5文档(我之前链接的)是一致的。我怀疑3.0文档中的行是一个错误。 – Joren 2009-11-20 09:32:41

0

你是正确的关闭流然后服务器。正如文档所述,这应该会导致所有套接字随着时间成功关闭。然而,几个头部抓挠的虫子教会了我随着时间的推移重要的一课:

别忘了冲洗!

stream.Flush(); 
stream.Close(); 
server.Close(); 

你会经常失去你以为你可能已经以其他方式发送了一些数据。这还有助于确保在关闭流时该流应该为空且处于非活动状态。

+9

来自NetworkStream上的文档:“Flush方法实现Stream.Flush方法;但是,因为NetworkStream没有缓冲,所以它不会影响网络流,调用Flush方法不会引发异常。 因此,如果您刷新流或没有真正的问题。 – Joren 2009-11-20 09:29:05

3

我会将TCP连接与套接字相关联。

通常,该过程是这样的:与SocketShutdown.Send参数 3.环路上接收,直到它返回0或失败,异常 1完成发送数据 2.呼叫Socket.Shutdown。调用close()

下面是伪代码一个小样本,这是非常类似于C#:)

void CloseConnection(Socket socket) 
{ 
    socket.Send(/*last data of the connection*/); 
    socket.Shutdown(SocketShutdown.Send); 

    try 
    { 
     int read = 0; 
     while((read = socket.Receive(/*application data buffers*/)) > 0) 
     {} 
    } 
    catch 
    { 
     //ignore 
    } 
    socket.Close(); 
} 

如果第一和第三步骤被跳过 - 数据丢失可能发生。

取自How to close TCP socket

+0

正是我需要的,谢谢!在我的情况下,其他答案不起作用。这可能是因为在某些情况下,我没有从客户端读取所有可用的数据(在某些情况下,我会在读取所有数据之前返回错误,然后关闭连接)。使用这种方法,它开始关闭,然后读取任何其他等待的数据。 – eselk 2013-09-15 12:27:13

相关问题