当客户端断开连接时检测和写入

问题描述:

即时通讯在C#中编写一个简单的客户端/服务器应用程序。 正如你所看到的那样,如果(cSocket.Connected)标签中的代码,我想要类似的东西... 如果一个cSocket断开连接... 我会给代码,你可以从标题和我的理解我的问题解释...当客户端断开连接时检测和写入

这是代码;

服务器;

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 

namespace ConsoleApplication1 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     TcpListener sSocket = new TcpListener(System.Net.IPAddress.Any, 3162); 
     int Counter = 0; 
     Console.ForegroundColor = ConsoleColor.Green; 
     Console.WriteLine("\n >> Server Started!"); 
     sSocket.Start(); 
     while (true) 
     { 
      Socket cSocket = sSocket.AcceptSocket(); 
      NetworkStream NetworkStr = new NetworkStream(cSocket); 
      BinaryReader bReader = new BinaryReader(NetworkStr); 
      BinaryWriter bWriter = new BinaryWriter(NetworkStr); 
      IPEndPoint remoteIpEndPoint = cSocket.RemoteEndPoint as IPEndPoint; 

      if (cSocket.Connected) 
      { 
       Counter = Counter + 1; 
       Console.ForegroundColor = ConsoleColor.Yellow; 
       Console.WriteLine("\n >> Client Connected! ~ Total: " + Counter + " ~ [" + remoteIpEndPoint + "]"); 
       bWriter.Write("\n >> Server Says: You Connected to Me!"); 
      } 
     } 
    } 
} 

感谢您的帮助:)

+0

你是什么**连接意味着**?你只能从一个连接的套接字初始化NetworkStream(我的意思是在AcceptSocket返回时它已经连接套接字) – hmmftg 2012-07-27 01:41:43

我不是那熟悉的.NET的东西,但在理论的应用和协议(包括TCP/IP)有某种超时等待。就像在TCP/IP协议族中一样,一方在发送一个包之后等待另一个时间,如果他没有得到答案,他会在一段时间后再次尝试和/或关闭连接。

总之,您可以定期发送一个小的请求,并检查客户是否回答。

由于OPI Saied如何操作这样的事情一定会做到(这是从*的另一个答案):

public static bool SocketConnected(Socket s) 
     { 
      if (!s.Connected) return false; 
      bool part1 = s.Poll(1000, SelectMode.SelectRead); 
      bool part2 = (s.Available == 0); 
      if (part1 & part2) 
       return false; 
      return true; 
     } 
+0

我的意思是在vb中有winsock控件,它有“关闭”事件,但是在c#中没有这样的事件,我将使用你的代码:)谢谢你的帮助... – 2012-07-27 13:35:22