《在C#中實現Socket埠複用》 以及《 UDP 一個封鎖操作被對 WSACancelBlockingCall 的呼叫中斷。》問題
阿新 • • 發佈:2019-02-14
原文網址:http://www.cnblogs.com/graypigeon/archive/2012/02/18/2357176.html
1.問題:在Socket通訊中,我們經常要多客戶端共用一個埠,但這往往會報錯,因為正常來說一個埠只能繫結一次,但釋放的時候比較麻煩,所以還是要是實現埠共用的話,就不用執行一個關一個再開一個。
2.實現埠複用:
正常繫結:
新增共用函式:SetSocketOption//定義網路地址,連線型別與網路協議並繫結本地IP與埠 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ipPoint = new IPEndPoint(IPAddress.Parse(ipAdrr), 2012); socket.Bind(ipPoint);
//定義網路地址,連線型別與網路協議並繫結本地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)); } }