Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭TCP连接的正确方法是什么_C#_Tcp_Networkstream - Fatal编程技术网

C# 关闭TCP连接的正确方法是什么

C# 关闭TCP连接的正确方法是什么,c#,tcp,networkstream,C#,Tcp,Networkstream,我有一个TcpClient对象,它使用底层的NetworkStream.Write()向服务器发送一些数据。 为此,我: TcpClient server = new TcpClient(serverName, 50001); /* ... */ NetworkStream stream = server.GetStream(); 现在,当按下按钮时,连接应关闭。 关闭连接的正确方法是什么?MSDN文档说关闭TcpClient(with.Close())实际上并没有关闭套接字,只是关闭了T

我有一个TcpClient对象,它使用底层的NetworkStream.Write()向服务器发送一些数据。 为此,我:

TcpClient server = new TcpClient(serverName, 50001);

/* ... */

NetworkStream stream = server.GetStream();
现在,当按下按钮时,连接应关闭。 关闭连接的正确方法是什么?MSDN文档说关闭TcpClient(with.Close())实际上并没有关闭套接字,只是关闭了TcpClient资源(这至少是我理解文档的方式)

那么,执行下一个代码会正确地关闭连接吗

stream.Close();
server.Close();
这足够了吗,或者我应该先检查(以某种方式)流(或服务器)是否可以关闭(以防连接半开或其他情况)

更重要的是,
NetworkStream.Close()
MSDN docs声明它释放了资源(甚至是套接字),因此可能关闭流就足够了,因为在此之后我会阻止使用TcpClient

什么是正确的方法?

比如说:

调用此方法最终将关闭关联的套接字,如果创建了关联的网络流,还将关闭用于发送和接收数据的关联网络流

所以
server.Close()就足够了

不过,先关闭NetworkStream不会有什么坏处


顺便说一句,如果您碰巧只在一个方法中使用TcpClient,请将其包装在
using()
语句中,这样您就可以确保对其调用
Dispose()
(相当于
Close()
),即使引发异常等。

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

别忘了冲洗

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

您经常会丢失一些原本以为可以发送的数据。这也有助于确保流在关闭时为空且处于非活动状态。

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

一般来说,程序如下: 1.完成发送数据 2.调用Socket.Shutdown和SocketShutdown.Send参数 3.在接收时循环,直到返回0或因异常而失败 4.通话结束()

下面是一个小的伪代码示例,非常类似于C:)

如果跳过第一步和第三步,可能会发生数据丢失


摘自

我想我太信任IntelliSense了。TcpClient.Close()的弹出窗口声明:“在不关闭基础连接的情况下处理这个System.Net.Sockets.TcpClient实例。”奇怪的事情。谢谢你的回复。事实上,3.0文档()在第一句中就是这么说的。。。但是第三句话说它确实关闭了套接字和网络流。3.5文档(我之前链接过)是一致的。我怀疑3.0文档中的行是错误的。从NetworkStream上的文档中可以看出:“Flush方法实现Stream.Flush方法;但是,由于NetworkStream没有缓冲,它对网络流没有影响。调用Flush方法不会引发异常。”所以不管你是否冲水都无关紧要。这正是我需要的,谢谢!在我的情况下,其他答案不起作用。这可能是因为在某些情况下,我没有从客户端读取所有可用数据(在某些情况下,我会在读取所有数据之前返回一个错误,然后关闭连接)。使用此方法,它启动关机,然后读取任何其他等待的数据。
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();
}