使用TCP套接字(C#),如何在接收方';结束?

使用TCP套接字(C#),如何在接收方';结束?,c#,sockets,tcp,C#,Sockets,Tcp,我正在为我的iPhone应用程序编写服务器应用程序。im工作的服务器部分是中继服务器。这实际上是通过服务器,使用TCP套接字在iPhone之间传递消息。服务器从流中读取头的长度,然后从流中读取该字节数。它对标题进行反序列化,并检查消息是否要转发到另一台iPhone(而不是在服务器上处理) 如果必须中继,它将开始从发送方的套接字读取字节,每次读取1024字节。接收到每1024个字节后,它会将这些字节(作为字节的“包”)添加到传出消息队列中,并按顺序进行处理 不过,这一切都很好,但如果发送方被中断,

我正在为我的iPhone应用程序编写服务器应用程序。im工作的服务器部分是中继服务器。这实际上是通过服务器,使用TCP套接字在iPhone之间传递消息。服务器从流中读取头的长度,然后从流中读取该字节数。它对标题进行反序列化,并检查消息是否要转发到另一台iPhone(而不是在服务器上处理)

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

不过,这一切都很好,但如果发送方被中断,因此它没有发送所有字节(比如,在它必须发送的3000字节中,发送的iPhone在2500字节后进入隧道),会发生什么情况

这意味着所有其他设备都在等待剩余的500字节,这些字节不会被中继到它们。然后,如果发送方(或其他相关人员)将数据发送到这些套接字,他们会认为新消息的开始就是最后一条消息的结束,从而破坏数据

显然,从上面的描述来看,我在使用消息框架,但我认为我遗漏了一些东西。据我所见,消息帧似乎只允许接收者在将它们组装成一个对象之前知道从套接字读取的确切字节数。一旦一两个字节在某个时候出错,所有东西都会失去同步,事情会不会开始变得棘手呢?有没有一种标准的方法可以重新同步

一旦一两个字节在某个时候出错,所有东西都会失去同步,事情会不会开始变得棘手呢?有没有一种标准的方法可以重新同步

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

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

在这种情况下,我脑子里有一些选择:

  • 在将消息发送到点B之前,让服务器缓冲来自点A的整个消息
  • 如果从A侧检测到异常闭合,则闭合B侧插座
  • 更改协议的接收端,以便B端客户端可以检测部分a流并从中恢复,而无需终止和重新建立套接字。e、 例如,如果服务器为每个传入的a流提供了一个唯一的id,那么B客户机将能够检测不同的流是否启动。或者有一个额外的长度前缀,这样B客户机既知道预期的整个长度,也知道单个消息的长度
选择哪个选项取决于传输的数据类型以及不同部分的更改容易程度


无论采用何种解决方案,请务必包括。

这似乎更适合UDP,因为您不希望受单个连接的流量控制延迟的影响来管理数据包中继。我明白您的观点,但我的整个网络层都是TCP,TCP非常适合于此,它只是中继部分,似乎与设计不太相符。我只是想知道我是否遗漏了一些简单的东西。我想如果发生上述情况,我就把中继服务器端的插座掉了。这将清除缓冲区,当发生断开连接时,来宾设备将自动重新连接套接字。我可能会选择选项二,关闭B端套接字。我宁愿先避免缓冲整个消息,因为每次中继1024字节可以减少中继时服务器上的内存需求。为关于半开放连接的提示干杯。死链接,这一个似乎起作用了: