运维开发网

.net – 阻止TCP套接字写然后立即关闭 – 这是一个问题吗?

运维开发网 https://www.qedev.com 2020-06-13 20:49 出处:网络 作者:运维开发网整理
我有一个发送器,TCP连接,发送数据块,并关闭套接字. 我想写一个最简单但可靠的程序来完成上述工作. 首先想到的是(例如在.NET中,尽管通常与套接字相关的问题): // assuming LingerOption(false), NoDelay set to whatever var client = new TcpClient().Connect(server, port); var stre
我有一个发送器,TCP连接,发送数据块,并关闭套接字.

我想写一个最简单但可靠的程序来完成上述工作.

首先想到的是(例如在.NET中,尽管通常与套接字相关的问题):

// assuming LingerOption(false), NoDelay set to whatever
var client = new TcpClient().Connect(server, port);
var stream = client.GetStream();
stream.Write(data, 0, data.Length);
stream.Close();
client.Close();

现在来看一些基于阅读各种MSDN和其他材料的问题:

> stream.Close()调用Socket.Close().

据说Socket.Close()关闭

立即,丢弃网络

缓冲区数据未发送.这个

不好.但是,Socket.Write

文档说,如果

套接字阻塞(它是,通过

默认情况下),Socket.Write将阻止

直到所有数据都被发送.所以

没问题,对吧?

>一般情况下,可能存在上述代码的情况

将导致接收器没有

接收发送的所有内容

在写? (假设100%可靠

网络)

在Socket.Write之后调用Close是绝对可以的.这是什么TCP RFC 793 says:

“Closing connections is intended to be a graceful operation in the sense that outstanding SENDs will be transmitted (and retransmitted), as flow control permits, until all have been serviced. Thus, it should be acceptable to make several SEND calls, followed by a CLOSE, and expect all the data to be sent to the destination.

混淆部分来自MSDN documentation:

“If you are using a connection-oriented protocol, Send will block until all of the bytes in the buffer are sent

实际上,阻止Write只将数据复制到传出缓冲区并返回.根据RFC 793,网络提供商有责任在调用Socket.Close之后完成数据的传递(当然,只要连接没有死亡).

0

精彩评论

暂无评论...
验证码 换一张
取 消