我正在使用.NET Framework 4.6.2和C#开发套接字服务器和客户端。

客户端是 SynchronousSocketClient

服务器类或多或少像这个one

在客户端上,我发送数据以更新数据库。

在服务器上,我在数据库中进行操作(使用存储过程更新表)。

该过程是客户端将数据发送到服务器,服务器对数据进行处理并发送回带有结果的消息。

有时,该数据库操作会花费更多时间来执行此操作。当此时间大于Socket.ReceiveTimeout时,由于超时,我得到了SocketException,但我不处理来自服务器的数据。

有什么方法可以处理服务器发送的数据?

超时后,我不再等待服务器发送的数据,而是再次启动该过程,将新数据发送到服务器,但是当我尝试从此新数据中读取服务器结果时,我会读取服务器响应对于前一个。

客户端上的过程很关键,我迫不及待地想从服务器上获得答案。我需要继续处理数据。

最佳答案



我建议在向服务器发送消息时使用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/

10-11 22:35
查看更多