我正在使用 .NET Framework 4.6.2 和 C# 开发套接字服务器和客户端。
服务器类大致是这样的one .
在客户端我发送数据更新数据库。
在服务器上,我在数据库中执行操作(使用存储过程更新表)。
这个过程是客户端向服务器发送数据,服务器处理它并返回一个消息和结果。
有时,数据库操作需要更多时间来完成。当此时间大于 Socket.ReceiveTimeout
时,我会因超时而收到 SocketException
,并且我不会处理来自服务器的数据。
有什么方法可以处理服务器发送的这些数据吗?
超时后,我不再等待服务器发送的数据,我再次启动该过程,向服务器发送新数据,但是当我尝试从这个新数据读取服务器结果时,我读到服务器对前一个的响应。
客户端的进程很关键,我迫不及待地想从服务器得到答案。我需要继续处理数据。
最佳答案
but when I try to read the server result from this new data, I read the server response for the previous one.
我建议在向服务器发送消息时使用 ID。 (您可以使用发送缓冲区的前 2 个字节)服务器在发送响应时将使用此 ID。现在在客户端,您可以检查您的响应是否具有相同的 ID。如果有,您可以使用数据,否则您只需丢弃它并尝试读取下一个传入响应。
从原理上讲,它看起来像这样:
ID = 1
Client ------------> Server
ID = 1
Client <------------ Server
ID = 2
Client ------------> Server
X----ERROR----TimeOut
ID = 3
Client ------------> Server
ID = 2
Client <------------ Server
Client 3!=2 --> do not process, read again
ID = 3
Client <------------ Server
关于c# - 套接字超时后删除任何待读取的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41218294/