gpt4 book ai didi

c# - TcpClient write 方法是否保证数据被传送到服务器?

转载 作者:太空狗 更新时间:2023-10-30 00:31:02 29 4
gpt4 key购买 nike

我在客户端和服务器上都有一个单独的线程,它们正在从套接字读取/写入数据。

我正在使用同步 TcpClient im(如文档中所建议的): https://msdn.microsoft.com/cs-cz/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx

当连接关闭时.Read()/.Write() 抛出异常。这是否意味着当 .Write() 方法没有抛出数据时,数据已正确传递给另一方,或者我是否需要实现自定义 ACK 逻辑

我阅读了 Socket 和 TcpClient 类的文档,但没有一个描述这种情况。

最佳答案

返回的 send() 调用意味着(或您使用的任何包装器,如 SocketTcpClient)在流式传输、阻塞internet socket是字节放在发送机器的缓冲区中。

MSDN Socket.Send() :

A successful completion of the Send method means that the underlying system has had room to buffer your data for a network send.

和:

The successful completion of a send does not indicate that the data was successfully delivered.

对于 .NET,底层实现是 WinSock2,文档:send() :

The successful completion of a send function does not indicate that the data was successfully delivered and received to the recipient. This function only indicates the data was successfully sent.

调用 send() 返回并不意味着数据已成功传送到另一端并由消费应用程序读取。

当数据没有被及时确认,或者当另一方发送 RST 时,Socket(或任何包装器)将处于故障状态,使 下一个 send()recv() 失败。

所以为了回答你的问题:

Does it mean that when .Write() method does not throw the data were delivered correctly to the other party or do I need to implement custom ACK logic?

不,它没有,是的,您应该 - 如果它知道另一方已阅读该特定消息对您的应用程序很重要。

例如,如果服务器发送的消息指示客户端发生某种状态更改,客户端必须申请保持同步,就会出现这种情况。如果客户端不确认该消息,则服务器无法确定客户端是否处于最新状态。

在那种情况下,您可以更改您的协议(protocol),以便某些消息具有接收者必须返回的必需响应。请注意,实现应用程序协议(protocol)非常容易出错。如果您愿意,可以使用 state machine 实现各种协议(protocol)规定的消息流。 , 对于服务器和客户端。

当然这个问题还有其他解决方案,比如给每个状态一个唯一的标识符,在尝试涉及该状态的任何操作之前与服务器进行验证,触发先前失败同步的重试。

另见 How to check the capacity of a TCP send buffer to ensure data delivery , Finding out if a message over tcp was delivered , C socket: does send wait for recv to end?

关于c# - TcpClient write 方法是否保证数据被传送到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703500/

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