C# 关闭TCP连接的正确方法是什么
我有一个TcpClient对象,它使用底层的NetworkStream.Write()向服务器发送一些数据。 为此,我: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 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();
}