1. 程式人生 > >《在C#中實現Socket埠複用》 以及《 UDP 一個封鎖操作被對 WSACancelBlockingCall 的呼叫中斷。》問題

《在C#中實現Socket埠複用》 以及《 UDP 一個封鎖操作被對 WSACancelBlockingCall 的呼叫中斷。》問題

原文網址:http://www.cnblogs.com/graypigeon/archive/2012/02/18/2357176.html

1.問題:在Socket通訊中,我們經常要多客戶端共用一個埠,但這往往會報錯,因為正常來說一個埠只能繫結一次,但釋放的時候比較麻煩,所以還是要是實現埠共用的話,就不用執行一個關一個再開一個。

  2.實現埠複用:

     正常繫結:

//定義網路地址,連線型別與網路協議並繫結本地IP與埠
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            ipPoint = new IPEndPoint(IPAddress.Parse(ipAdrr), 2012);
          
            socket.Bind(ipPoint);
新增共用函式:SetSocketOption
//定義網路地址,連線型別與網路協議並繫結本地IP與埠
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            ipPoint = new IPEndPoint(IPAddress.Parse(ipAdrr), 2012);
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);  //SocketOptionName.ReuseAddress是關鍵
            socket.Bind(ipPoint); 

這樣就不會報佔用同一埠的錯了

對於中斷問題:原因大概是因為你關閉socket時,socket.Receive(buffer); 仍出於讀取狀態。

改為:

if (socket.Poll(-1,SelectMode.SelectRead))
                       {                      
                           if ( ( dataLength = socket.Receive(buffer) ) > 0)
                           {
                               Analyer(Encoding.ASCII.GetString(buffer, 0, dataLength));
                           }
                       }