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

时间:2012-03-18 01:53:28

标签: c# sockets disconnect

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

我有一个简单的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,所以我不清楚为什么我遇到这个问题。谢谢!

1 个答案:

答案 0 :(得分:2)

来自MSDN文档:

  

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

可能值得一试。

否则,如果您的代码段是任何迹象(基于您对TcpC的使用),您可能应该使用我认为会为您执行此操作的TcpClient.Close