C# 如何安全地判断另一端接收到TCP/IP数据包?

C# 如何安全地判断另一端接收到TCP/IP数据包?,c#,.net,tcpclient,C#,.net,Tcpclient,在本项目中,协议是: 开放式插座 发送数据 等待确认消息或超时 如果ack到达正确的窗口,则一切正常。合上插座 如果超时,请关闭插座并重新启动多达N次 我在日志中注意到,有时超时后,我们仍然会收到ack。由于插座保持打开状态,以便在关闭后进行清理和散乱,我理解原因 但是有没有更好的方法来处理这个问题呢?在向线路操作员报告某些情况之前,我想确定连接是否真的断开了 现在的超时是与外部计时器关联的任意值(2.5秒)。它不在.Net TCP堆栈中。除非您一侧的套接字关闭,否则TCP连接不会真正关闭。

在本项目中,协议是:

  • 开放式插座
  • 发送数据
  • 等待确认消息或超时
  • 如果ack到达正确的窗口,则一切正常。合上插座
  • 如果超时,请关闭插座并重新启动多达N次
我在日志中注意到,有时超时后,我们仍然会收到ack。由于插座保持打开状态,以便在关闭后进行清理和散乱,我理解原因

但是有没有更好的方法来处理这个问题呢?在向线路操作员报告某些情况之前,我想确定连接是否真的断开了


现在的超时是与外部计时器关联的任意值(2.5秒)。它不在.Net TCP堆栈中。

除非您一侧的套接字关闭,否则TCP连接不会真正关闭。如果TCP在发送数据后没有收到来自网络的任何响应,则需要几分钟时间来确定连接是否已关闭并关闭套接字。

除非套接字在您一侧关闭,否则TCP连接不会真正关闭。TCP在发送数据后,如果没有收到来自网络的任何响应,则需要几分钟的时间来确定连接已关闭并关闭套接字。

套接字抽象层通过TCP通道提供双向流。只有当Write()或等效项成功返回时,以及当Read()返回非零个字符时,用户才能看到堆栈接受了片段。下层是不透明的。为了确保服务器已接收并确认您的数据,您需要确认Read()在允许的时间段内返回预期的数据量

由于您必须为每个请求连接一个新会话,因此您别无选择,只能中断会话以为下一个请求让路。特别是,您不能留下会话,因为服务器可能不允许多个并发连接


您声明超时时间为2.5秒。如果这远小于消息间隔,则如果超时时间延长到接近消息间隔的时间,是否存在问题。这似乎比处理同一数据的多个快速请求更可靠。

套接字抽象在TCP通道上分层一个双向流。只有当Write()或等效项成功返回时,以及当Read()返回非零个字符时,用户才能看到堆栈接受了片段。下层是不透明的。为了确保服务器已接收并确认您的数据,您需要确认Read()在允许的时间段内返回预期的数据量

由于您必须为每个请求连接一个新会话,因此您别无选择,只能中断会话以为下一个请求让路。特别是,您不能留下会话,因为服务器可能不允许多个并发连接


您声明超时时间为2.5秒。如果这远小于消息间隔,则如果超时时间延长到接近消息间隔的时间,是否存在问题。与多次快速请求相同的数据相比,这似乎更可靠。

这里有什么有用的东西吗?当你谈论接收“ack”时,你是在谈论基本的TCP/IP ack,还是一个自制的确认消息?为了它的价值,我在.Net的Socket类之上制作了一些TCP/IP例程,作为WCF的自制替代。为确保连接仍处于活动状态,我每30秒发送一次ping消息,并检查我在过去90秒内是否收到ping,如果没有,我假定连接已丢失。@RenniePet我正在查看的确认来自应用程序。到目前为止,在最初的现场测试中,我看到大多数情况下,它发生在第一次尝试时,但有时确实需要再次尝试。在那些时候,我有时会收到一封迟来的回信。也许这里有什么有用的东西?当你谈论接收“ack”时,你是在谈论基本的TCP/IP ack,还是一个自制的确认消息?为了它的价值,我在.Net的Socket类之上制作了一些TCP/IP例程,作为WCF的自制替代。为确保连接仍处于活动状态,我每30秒发送一次ping消息,并检查我在过去90秒内是否收到ping,如果没有,我假定连接已丢失。@RenniePet我正在查看的确认来自应用程序。到目前为止,在最初的现场测试中,我看到大多数情况下,它发生在第一次尝试时,但有时确实需要再次尝试。在那些时候,我有时会收到一封迟来的确认信。我不是专家,但根据我的经验,Windows从不关闭套接字,因为连接上没有任何流量。或者可能是因为我将ReceiveTimeout设置为零?(当然,这不是OP所要问的…)无论如何,我建议OP实施某种ping,并自行决定连接是否可用。不要指望Windows或.Net做出这样的决定。即使没有数据传输,TCP连接也会保持连接数年。只有当连接尝试发送数据且无法获得回确认时,连接才会超时。@Fred客户的系统会为每一笔交易请求一个新连接。它简化了他们对数据的解析。我关心的是如何知道何时认输,并确定主机不可靠。如果您对响应性有严格要求,您可以在同一台计算机上并行运行一些heatbeat应用程序。@Fred可能,但连接仅在一个事务期间有效。下一个事务有自己的连接。我不是专家,但根据我的经验,Windows从不关闭套接字,因为连接上没有任何流量。或者可能是因为我将ReceiveTimeout设置为零?(当然,这不是OP所问的…)无论如何,我对OP的建议是