使用TCP套接字(C#),如何在接收方端检测邮件是否在传输过程中被中断?

时间:2011-07-03 09:39:57

标签: c# sockets tcp

我为我的iPhone应用程序编写服务器应用程序。我正在处理的服务器部分是中继服务器。这基本上通过服务器使用TCP套接字在iPhone之间中继消息。服务器从流中读取标头的长度,然后从流中读取该字节数。它反序列化标头,并检查是否要将消息中继到另一个iPhone(而不是在服务器上处理)。

如果必须进行中继,它会开始从发送方的套接字读取字节,一次1024字节。收到每个1024字节后,它会将这些字节(作为字节的“数据包”)添加到传出消息队列中,并按顺序处理。

但是,这很好,但是如果发送方被中断会发生什么,所以它没有发送所有字节(比如,在它必须发送的3,000个字节中,发送iPhone在2,500之后进入隧道)字节)?

这意味着所有其他设备正在等待剩余的500个字节,而这些字节不会被转发给它们。然后,如果发件人(或其他任何人)将数据发送到这些套接字,他们会认为新邮件的开头是最后一封邮件的结尾,从而破坏了数据。

显然从上面的描述中,我正在使用消息框架,但我认为我缺少了一些东西。从我所看到的,消息框架似乎只允许接收器在将它们组装到对象之前知道从套接字读取的确切字节数。一旦一两个字节在某个时刻误入歧途,一切都不同步,事情就会变得毛茸茸吗?有没有一种标准的方法可以重新同步?

1 个答案:

答案 0 :(得分:3)

  

一旦一两个字节在某个时刻误入歧途,一切都不同步,事情就会变得毛茸茸吗?有没有一种标准的方法可以重新同步?

TCP / IP本身确保单个套接字连接上没有字节“丢失”。

在您的情况下,事情会更复杂一些(如果我理解正确的话)您将服务器用作某种多路复用器。

在这种情况下,这里有一些选项:

  • 让服务器缓冲来自A点的整个消息,然后再将其发送到B点。
  • 如果从A侧检测到异常关闭,则关闭B侧插座。
  • 更改协议的接收方,以便B端客户端可以检测并从部分A流中恢复,而不会终止并重新建立套接字。例如,如果服务器给每个进入的A流提供唯一的id,则B客户端将能够检测是否开始了不同的流。或者有一个额外的长度前缀,因此B客户端知道所期望的整个长度以及该单个消息的长度。

您选择哪个选项取决于您要传输的数据类型以及不同部分的更改方式。

无论采用何种解决方案,请务必加入detection of half-open connections