如果连接提前关闭,则接收所有数据

本文关键字:数据 连接 如果 | 更新日期: 2023-09-27 18:28:12

我有一个客户端,它连接到服务器,开始发送二进制数据,发送完成后,它关闭连接。如果连接已关闭,则服务器知道客户端已完成发送文件。

我有一个简单的tcp类来处理连接。然后我有另一个向服务器发送数据的功能:

  TcpC tcp = new TcpC();
  void send_data_to_server(){
        tcp.connect();
        while(read_data){
            tcp.sendData();
        }
        Thread.Sleep(500);
        tcp.disconnect();
  }

服务器使用异步套接字,并有一个函数WaitForData(),当客户端断开连接时,该函数会发生异常。问题是,如果我删除Thread.Sleep(),WaitForData仍然捕获异常,但onDataReceive仍然没有接收到所有数据,因为我检查了异常中的缓冲区大小,它比使用Sleep()时小得多。

服务器将不得不处理许多这样的操作,我负担不起使用Sleep()"hack"让它工作。有时它无论如何都不起作用,我必须将睡眠间隔设置为几秒钟才能确定。除了WaitForData()之外,服务器端的其他异步函数都不会触发异常。

如何立即关闭连接并仍然获取所有数据?我认为tcp.disconnect是在发送完所有数据后调用的,所以我不清楚为什么会出现这个问题。谢谢

如果连接提前关闭,则接收所有数据

来自MSDN文档:

为了确保在套接字关闭之前发送和接收所有数据,应在调用Disconnect方法之前调用Shutdown。

也许值得一试。

否则,如果你的代码片段有任何指示(基于你对TcpC的使用),你可能应该使用TcpClient.Close,我相信它会为你做到这一点。