Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定TCP客户端连接何时中断并重新连接_C#_Sockets - Fatal编程技术网

C# 如何确定TCP客户端连接何时中断并重新连接

C# 如何确定TCP客户端连接何时中断并重新连接,c#,sockets,C#,Sockets,编辑:我理解这个问题,但需要一个代码示例来说明如何解决它 我希望我的客户端在断开连接时自动重新连接,但它显示为TcpClient。已连接的对它来说不可靠。我已经读到,您需要为类发送数据以更改该标志。有没有更好的方法来处理这个问题 //Method to handle reading data from buffer and deserializing public static async Task<Message> ReadMessageAsync(this TcpClient c

编辑:我理解这个问题,但需要一个代码示例来说明如何解决它

我希望我的客户端在断开连接时自动重新连接,但它显示为
TcpClient。已连接的
对它来说不可靠。我已经读到,您需要为类发送数据以更改该标志。有没有更好的方法来处理这个问题

//Method to handle reading data from buffer and deserializing
public static async Task<Message> ReadMessageAsync(this TcpClient client)
{
    if (client.Connected && client.Available > 0)
    {
        int totalBytesRead = 0;
        var data = new byte[client.Available];

        while (totalBytesRead < client.Available)
        {
            totalBytesRead += await client.GetStream().ReadAsync(data, 0, client.Available);
        }

        return BinarySerializer.DeserializeMessage(data) as Message;
    }

    return null;
}

public async Task Start()
{
    ConnectToServer();

    while (_isRunning)
    {
        // Reconnect to server if needed.
        if (!_tcpClient.Connected)
        {
            ConnectToServer();
        }

        // Wait for data
        var data = await _tcpClient.ReadMessageAsync();
            HandleData(data);
    }
}
//处理从缓冲区读取数据和反序列化的方法
公共静态异步任务ReadMessageAsync(此TcpClient客户端)
{
如果(client.Connected&&client.Available>0)
{
int totalBytesRead=0;
var data=新字节[client.Available];
while(totalBytesRead
TCP是一种非常健壮的协议,允许进行健壮的编程。对于客户机,您不需要依赖来自网络接口的低级别信令,协议/语言提供了您所需的一切(除非您的客户机时间紧迫,需要立即通知网络故障):

连接

  • 如果连接失败,请重试(在适当的超时后)或放弃
接收

  • 设置适当的接收超时,并在 引发超时异常(关闭套接字并重新启动) 再次或放弃,或通知用户或。将“信号”服务器死亡,或互联网死亡或
  • 检查接收的字节==0(表示正常断开连接 从另一边,FIN)并相应地采取行动
  • 如果另一方发送RST,您将得到一个异常,请处理该异常 因此

需要知道插座是否工作……可能与@MarcGravel重复感谢您的快速响应。我相信我了解最后的I/O设置标志只是不确定处理事件的最佳实践?捕获异常并再次调用
Connect
?旁注:这个类似乎希望您在程序流中使用异常,但这不是一个好的做法?请注意,您的代码会烧坏您的cpu,因为如果套接字中没有可用的数据(常见的事情),它基本上会变成while(true)循环。事件不会始终工作。事件由以太网接口上的活动引起。断开电缆将导致断开,但不会触发事件。正在关闭的服务器也不会导致该事件。事件发生的唯一时间是服务器关闭连接时。