亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以編程方式減少 TIME_WAIT 或 CLOSE_WAIT

以編程方式減少 TIME_WAIT 或 CLOSE_WAIT

C#
慕娘9325324 2021-06-19 15:02:05
在一個.aspx頁面中,我需要將一個套接字綁定到一個端口,使用它,然后處理它。它第一次工作,但第二次訪問該頁面時出現以下異常:[Exception in bind: System.Net.Sockets.SocketException (0x80004005): Only one usage of each socket  address (protocol/network address/port) is normally permittedat System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot,  SocketAddress socketAddress)at System.Net.Sockets.Socket.Bind(EndPoint localEP)[...]這是代碼,異常觸發錯誤。請注意 Accept() 塊在我的場景中是完全可以接受的。IPAddress ipAddress = IPAddress.Parse(ip);Socket s1 = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);IPEndPoint ep = new IPEndPoint(ipAddress, port);try {    s1.Bind(ep);} catch(Exception ex) {    HttpContext.Current.Response.Write("[Exception in bind: "+ ex + "\n");    return;}s1.Listen(32);// block until there's a connectionSocket s2 = s1.Accept();// save for laterSession["s1"] = s1;Session["s2"] = s2;套接字通過 Session 檢索并稍后使用,并銷毀:Socket s1 = Session["s1"] as Socket;Socket s2 = Session["s2"] as Socket;// ... use the socket ...// cleanups2.Shutdown(SocketShutdown.Both);s2.Disconnect(true);s2.Close();s2.Dispose();s1.Shutdown(SocketShutdown.Both);s1.Disconnect(true);s1.Close();s1.Dispose();我試過標志,如的各種組合Linger,ReuseAddress,ExclusiveAddressUse對于和值Listen積壓,但沒有改變。重要提示:沒有ReuseAddress插座連接器處于選項TIME_WAIT如圖netstat -ano。當我使用時ReuseAddress,插座卡在CLOSE_WAIT.我完全了解其中的含義:有沒有辦法以編程方式減少特定套接字的 CLOSE_WAIT 或 TIME_WAIT 間隔而無需觸摸注冊表?我想知道我在嘗試處理套接字時是否忘記了什么......
查看完整描述

1 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

事實證明,利用 Session 對象并不理想。第一次使用后,該端口將保持打開狀態,根據顯示的 PID netstat,IIS Worker 將擁有它。因此,似乎不可能調用Close()它。


解決方案是在以下之后關閉服務器套接字(s1在我的示例中)Accept:


[...]

s1.Listen(32);

// block until there's a connection

Socket s2 = s1.Accept();

// *close the server socket*

s1.Close();

// only save s2 for later

Session["s2"] = s2;

然后只使用s2,例如:


// ...later on

Socket s1 = Session["s1"] as Socket;

try {

    while ((bytesRead = s1.Receive(receiveBuffer)) > 0 ) {

        byte[] received = new byte[bytesRead];

        Array.Copy(receiveBuffer, received , bytesRead);

        Response.BinaryWrite(received);

    }

} catch(Exception ex){

[...]

先前的解決方案使“清理”變得不必要。


查看完整回答
反對 回復 2021-06-20
  • 1 回答
  • 0 關注
  • 272 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號