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)); } }