当我通过开放的tcp连接发送一些数据时,使用TcpClient
和NetworkStream
,如何检查接收方是否已回复最后一个数据包的TCP ACK?
如果接收方没有发送ACK会发生什么情况,我是否可以检测到这个异常?
我的目标是记录发送的数据包和收到的ACK之间的时间,并在丢失的pakets导致延迟时记录。
示例:
using (TcpClient client = new TcpClient("127.0.0.1",2000))
using (NetworkStream stream = client.GetStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.ASCII))
while (true)
{
writer.Write("test");
writer.Flush(); // this does nothing, NetworkStream.Flush is a NoOp
// do other stuff
}
在writer.Write()之后,如何确定数据是否仍然在内核缓冲区中,或者由于网络接口收到ACK而被删除?
tcp连接必须无限期保持打开状态,我无法关闭它。
NetworkStream.Flush()
或关联的StreamReader.Flush()
is not implemented并会立即返回。
我知道接收方可以发送一条我可以检查的明确回复消息。但是在这种情况下,协议无法更改。
我也知道,通过设置TcpClient.NoDelay=true
,我可以减少发送少量数据时的延迟。但是,这仍然没有告诉我是否收到了ACK。
有没有办法从c#检查是否已收到确认,或收到的速度有多快?