1. 程式人生 > >C#服務端判斷客戶端socket是否已斷開的方法

C#服務端判斷客戶端socket是否已斷開的方法

endpoint point style 返回 接收 ipaddress emp ipa ner

剛開始,用Socket類的Connected屬性來實現,卻發現行不通,connected只表示 是在上次 還是 操作時連接到遠程主機。如果在這之後[連接的另一方]斷開了,它還一直返回true, 除非你再通過socket來發送數據。所以通過個屬性來判斷是行不通的!
後來有人說可以用Socket.Available屬性來判斷,Socket.Available表示獲取已經從網絡接收且可供讀取的數據量。

msdn中說:如果[連接的另一方]斷開了,它就會拋出異常。然而,這個BUG報告(http://dam.mellis.org/2004/08/net_socket_bugs_gotchas/)卻指出:msdn的說法並不完全正確,這個屬性只有在少數情況下才拋出異常。所以,這一招還是行不通!

最後使用socket.Poll()方法來完成實現,此方法是確定socket的狀態。看下面的代碼:

服務端代碼:

class Program

    {
        private static List<Socket> list=new List<Socket>(); 
        static void Main(string[] args)
        {            
            Timer timer=new Timer(1000);
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            timer.Start();
            Thread thread 
= new Thread(Listener); thread.Start(); } //每秒服務端向客戶端推送 static void timer_Elapsed(object sender, ElapsedEventArgs e) { if (list.Count > 0) { for (int i = list.Count-1; i >=0; i--) {
string sendStr = "Server Information"; byte[] bs = Encoding.ASCII.GetBytes(sendStr); if (list[i].Poll(1000, SelectMode.SelectRead)) //SelectMode.SelectRead表示,如果已調用 並且有掛起的連接,true。 - 或 - 如果有數據可供讀取,則為 true。- 或 - 如果連接已關閉、重置或終止,則返回 true(此種情況就表示若客戶端斷開連接了,則此方法就返回true); 否則,返回 false。 { list[i].Close();//關閉socket list.RemoveAt(i);//從列表中刪除斷開的socke continue; } list[i].Send(bs, bs.Length, 0); } } } public static void Listener() { int port = 11000; string host = "192.168.7.36"; /**/ ///創建終結點(EndPoint) IPAddress ip = IPAddress.Parse(host);//把ip地址字符串轉換為IPAddress類型的實例 IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint類的新實例 /**/ ///創建socket並開始監聽 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//創建一個socket對像,如果用udp協議,則要用SocketType.Dgram類型的套接字 s.Bind(ipe);//綁定EndPoint對像(2000端口和ip地址) s.Listen(10);//開始監聽 Console.WriteLine("等待客戶端連接"); while (true) { /**/ ///接受到client連接,為此連接建立新的socket,並接受信息 list.Add(s.Accept());//為新建連接創建新的socket Console.WriteLine("建立連接"); string recvStr = ""; byte[] recvBytes = new byte[1024]; int bytes; bytes = list[list.Count-1].Receive(recvBytes, recvBytes.Length, 0);//從客戶端接受信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); /**/ ///給client端返回信息 Console.WriteLine("server get message:{0}", recvStr);//把客戶端傳來的信息顯示出來 string sendStr = "ok!Client send message successful!"; byte[] bs = Encoding.ASCII.GetBytes(sendStr); list[list.Count-1].Send(bs, bs.Length, 0);//返回信息給客戶端 //temp.Close(); } s.Close(); } }

轉自:http://hi.baidu.com/jack1865/item/3dcba2d3b0e2e29932db904d

C#服務端判斷客戶端socket是否已斷開的方法