如果连接提前关闭,则接收所有数据
本文关键字:数据 连接 如果 | 更新日期: 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
,我相信它会为你做到这一点。