gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:32:31 24 4
gpt4 key购买 nike

我有一个 TCP 连接、发送数据 block 并关闭套接字的发送器。我想编写执行上述操作的最简单但可靠的程序。首先想到的是(例如在 .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 和其他 Material 的问题:

  1. stream.Close() 调用 Socket.Close()。Socket.Close() 据说关闭立即,丢弃网络缓冲未发送的数据。这个不好。但是,Socket.Write文件说,如果套接字阻塞(它是,由默认),Socket.Write 将阻止直到发送完所有数据。所以没问题吧?
  2. 一般来说,有没有一种情况,上面的代码将导致接收器不收到所有发送的东西在写? (假设 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 后完成数据的传送(当然,只要连接没有死)。

关于.net - 阻塞 TCP 套接字写入然后立即关闭 - 这是一个问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1342654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com