當前位置:編程學習大全網 - 圖片素材 - 如何控制C#Socket的連接超時時間

如何控制C#Socket的連接超時時間

Socket.connect連接超時有二種情況: 1.由於網絡的問題,TCP/IP三次握手時間>timeout的設置時間。這在國外訪問weibo時,並且網絡環境極差的情況下有可能發生。解決的辦法:調大socket.connect方法中的timeout參數值,比如50s,linux默認最高是70s,如果超過70s沒有意義,linux會采用70s.但是當調大之後,發現不到10s就報timeout exception。通過國外的機器ping api.weibo.com發現unreachable。說明客戶端在傳輸層之下的網絡層就發現連個Syn的報文都發不出去,更不用說三次握手了,客戶端直接失敗並拋timeout exception。 經驗:在connection timeout診斷的第壹步應該是ping壹下確認網絡層沒有問題。註:客戶端設置了timeout,但並不會等到超時才返回異常。客戶端只要第壹時間發現連接失敗,就會拋timeout exception。2.如果timeout設置的時間足夠,但是由於服務器端的處理能力較差,比如緩沖連接隊列較小,而應用層的處理能力沒有連接緩沖快,導致緩沖連接占滿,而拒絕新的連接。在服務端因為連接隊列占滿而拒絕服務的期間,客戶端的通過TCP協議重試三次。每次的時間翻倍。如果三次時間的累加<timeout參數值且能連接上,屬於正常情況,表示隊列騰出空位放當前連接。如果三次時間的累加<timeout參數值且未能連接上,則客戶端會立刻拋出timeout exception,而不等timeout到期才拋。 下面是壹個異步socket典型的連接程序connectDone 是ManualResetEvent類型可以在connectDone.WaitOne();中使用等待的時間來限制連接超時比如connectDone.WaitOne(5000);是超時時間為5秒connectDone.WaitOne(); public void Conn(){try{ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP);IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort);connectDone.Reset();ClientSocket.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback),ClientSocket);connectDone.WaitOne();StateObject state = new StateObject(bufferSize,ClientSocket);ClientSocket.BeginReceive(state.buffer,0,bufferSize,0,new AsyncCallback(ReceiveCallback), state);}catch(Exception e){OnErrorEvent(new ErrorEventArgs(e));}}所有代碼見:/zhiang75/article/details/75915

  • 上一篇:電影裏有個男孩叫約翰裏斯被機器人追殺,這個是什麽電影
  • 下一篇:小熊標誌的衣服是什麽牌子
  • copyright 2024編程學習大全網