c# - 套接字超时后删除任何待读取的数据

标签 c# sockets tcplistener

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

客户是SynchronousSocketClient .

服务器类大致是这样的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/

相关文章:

c# - 如何从 C# Windows 应用程序项目调用 C++ dll

C文件服务器和客户端卡在recv上

java - DataInputStream接收不准确

c# - 使用 VB 的 FileSystem.DeleteFile 方法无法正常工作,将文件删除到 csharp 中的回收站

c# - 使用无效/任务响应注册 MediatR 管道

c# - 您如何发现 TCPListener 服务的 IP 地址?

.net - Thread.Sleep 是否会停用 TCPListener?

tcp - 为什么在 TCP 服务器程序中我们需要在 write() 之前先读()?

c# - 限制应用程序的多个实例

c - 我的 uvlib 默认循环意外退出 - 为什么?