.net TcpClient-如何确定何时交付字节?

.net TcpClient-如何确定何时交付字节?,.net,tcp,.net-4.0,tcpclient,.net,Tcp,.net 4.0,Tcpclient,使用TcpClient时,我如何知道服务器已收到或未收到什么?例如,假设我的消息是一个很长的字符串: string myAppMessage = "was up too late coding, bla, bla, bla, ....." byte[] allBytes = Encoding.ASCII.GetBytes( myAppMessage ); 我想把整个字符串交给TCP,我想知道整个字符串都被发送到服务器并被服务器接收 似乎有一些通过TCP发送数据的常用方法: var client

使用TcpClient时,我如何知道服务器已收到或未收到什么?例如,假设我的消息是一个很长的字符串:

string myAppMessage = "was up too late coding, bla, bla, bla, ....."
byte[] allBytes = Encoding.ASCII.GetBytes( myAppMessage );
我想把整个字符串交给TCP,我想知道整个字符串都被发送到服务器并被服务器接收

似乎有一些通过TCP发送数据的常用方法:

var client = new TcpClient( IP_ADDR , PORT )
client.GetStream().Write( allBytes )
-或-

client.client.Send(所有字节)


其中一个或两者都能保证整个消息的传递吗?在第一种情况下,是否只有在我调用流上的
Flush()
后才能保证?我认为上面的一个或两个都在阻止通话。如果在没有引发异常的情况下完成,我是否可以认为这意味着整个消息已传递/接收?

您需要接收来自另一方的确认。备选方案:

  • 让远程方向您发送确认函
  • 让远程方
    关闭(读取)
    连接。调用
    Read
    ,直到它返回0。0表示远程端已关闭且已接收到所有数据
  • 调用关机(写入)。这将等待来自远程端的确认

  • 单独发送并不保证交付。

    嗨,usr-我不确定如何实施这些建议。您是否有可以共享的代码示例?请注意,除了使用标准TCP之外,我对远程端没有任何影响。请参阅(3)。这是确保在没有远程方合作的情况下接收数据的唯一方法。实际上,您的机器可以在不关机的情况下等待来自远程端的确认,但我所知道的任何API都不会公开此功能。usr-您能再多说一点关于#3的内容吗?当TCP将字节流传输到远程方时,它不是在接收ACK吗?似乎必须结束连接才能确认之前发送的所有内容都已收到?是的。随着时间的推移,ACK开始出现。监听其中一个就足够了,但操作系统不会通过任何API公开此功能。可能是这样,但不是这样。远程端是否向您发送任何数据,您可以使用这些数据推断您的数据已被接收?嗨,Usr-不幸的是,没有。这是一条单向流。谢谢你在这件事上的帮助!