《在C#中實現Socket端口復用》 以及《 UDP 一個封鎖操作被對 WSACancelBlockingCall 的調用中斷。》


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));                            }                        }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM