C#套接字服务器,它有大约200 - 500个活动连接,每个连接不断向我们的服务器发送消息。
大约70%的时间消息处理正常(按照正确的顺序等),然而在其他30%的情况下,我们混淆了消息,事情搞砸了。我们应该注意到一些客户端以unicode发送数据,而其他客户端则以ASCII格式发送数据,因此也可以处理。
发送到服务器的消息是一个可变长度的字符串,以char3结尾,它是我们打破的char3,而不是我们继续接收数据。
任何人都可以对我们的ProcessReceive代码有所了解,看看有什么可能导致我们的问题以及我们如何解决这个小问题(这里希望这是一个小问题!)
以下代码:
答案 0 :(得分:1)
首先,我相信你知道,但总是值得重复; TCP是一个字节流。它不知道您可能确定存在于该字节流中的任何应用程序级别“消息”。所有成功的套接字Recv调用,无论是同步还是异步,都可以在1和所提供的缓冲区大小之间返回任意数量的字节。
考虑到这一点,你应该在做其他任何事情之前处理你的消息框架(即寻找你的分隔符)。如果你没有找到分隔符,那么只需使用相同的SocketAsyncEventArgs
重新发出读取,相同的缓冲区并将偏移量设置为当前所在的位置,这会将更多数据读入缓冲区,您可以再看看对于分隔符,一旦下一次读取完成...理想情况下,您将跟踪在此缓冲区中搜索分隔符时最后到达的位置,以减少重复扫描......
现在你没有这样做,如果你收到一条消息,如果消息被多个读取分开,你可能会引用消息中的任何字节,那么你对e.Buffer[e.Offset] == 255
的使用就会失败
答案 1 :(得分:0)
我看到的问题是你在从socket读取的当前缓冲区中调用的缓冲区上调用Encoding.Unicode.GetString()。但是,该缓冲区的内容可能不是字符串的有效unicode编码。
您需要做的是缓冲整个流,然后在收到所有数据后,在最后一次操作中将其解码为字符串。