C# 网络关闭时TCP客户端连接状态问题

C# 网络关闭时TCP客户端连接状态问题,c#,networking,tcp,tcpclient,tcp-ip,C#,Networking,Tcp,Tcpclient,Tcp Ip,我有一个TcpClient,我正在连接到机器上,一切正常。现在,我想通过计时器在每60秒的时间内监控连接状态。根据对该主题的基础研究,我知道没有直接的方法来测试它。因此,我试图通过最近的当应用程序退出网络时发送到计算机的消息 这是密码 // Find out whether the socket is connected to the remote host. //Send a message to Machine try { byte[] notify = Encoding.AS

我有一个
TcpClient
,我正在连接到机器上,一切正常。现在,我想通过计时器在每60秒的时间内监控连接状态。根据对该主题的基础研究,我知道没有直接的方法来测试它。因此,我试图通过最近的当应用程序退出网络时发送到计算机的消息

这是密码

 // Find out whether the socket is connected to the remote host.

 //Send a message to Machine
 try
 {
  byte[] notify = Encoding.ASCII.GetBytes("Hello");
  stream.Write(notify, 0, notify.Length);     
 }catch { }

 //Check if it reached to machine or failed 
 bool getConnectionStatus = client.Connected;

 if (getConnectionStatus == true)
     {
         //Do nothing
     }
 else
     {
        //Stop the thread
        _shutdownEvent.WaitOne(0);
        _thread.Abort();

         //Start Again
         _thread = new Thread(DoWork);
         _thread.Start();
      }
但在这种情况下发生的最令人惊讶的事情是,如果机器不在网络中,那么在第一次写入时,它也能够写入,这就是为什么连接状态是连接的,尽管它不在网络中。第二次,当它试图发送数据时,它失败了,并且与预期状态一样断开连接

我面临的主要问题是,一旦它与网络断开连接,为什么它能够发送数据。因此,当网络关闭时,我丢失了机器中存储的所有缓冲区数据。
请帮帮我。

在引擎盖下,
写入操作只会将数据发送到网络层;在尝试传输数据之前,您可能会得到“成功”结果。如果数据较小,网络层甚至可能会延迟发送数据一段时间,以尝试一次发送一批少量消息

Alex K.简短地说,检查网络连接最可靠的方法是等待响应。如果在一定时间内没有收到此类响应,则连接将丢失

假设您继续使用“Hello”,服务器应该以“Yeah!”作为响应。在客户端,您可以通过以下方式扩展当前代码:

try
{
    byte[] notify = Encoding.ASCII.GetBytes("Hello");
    stream.Write(notify, 0, notify.Length);
    byte[] notifyResult = new byte[5];
    int bytesRead = stream.Read(notifyResult, 0, 5);
    if (bytesRead == 0)
    {
        // No network error, but server has disconnected
    }

    // Arriving here, notifyResult should contain ASCII "Yeah!" 
}
catch (SocketException)
{
    // Network error
}
在服务器上,您应该识别正在发送的“Hello”,并简单地用“Yeah!”回应。我不知道您的服务器目前在做什么,但它可能类似于:

switch (receivedMessage)
{
    case "Hello":
        stream.Write(Encoding.ASCII.GetBytes("Yeah!"), 0, 5);
        break;
}
注意,你应该考虑在信息包中包装你的消息,即:

<Message Type> <Message> <Terminator Character>
ie. "KHello\n"

例如“KHello\n”


比如“你好”
如果消息类型“K”是保持活动的消息,换行符“\n”是终止符字符,“0005”是不包括消息类型的消息长度


这样,服务器将始终能够判断是否已收到完整消息,消息类型可以指示“Hello”是作为数据还是保持活动数据包发送的。

发送“PING”,等待“PONG”@AlexK。很抱歉,我没有得到你可以请你给我的例子或psudocode连接到我的代码在张贴。事实上,我是新的领域,所以没有得到的条款clearly@shubhamHegdey增加了一个例子。我希望你能在这方面取得一些进展。
<Size of Message> <Message Type> <Message> 
ie. "0005KHello"