⑴ LINUX C 進行TCP網路連接,怎樣設置連接超時時間
如果你確定,真的不需要等這么久,或者用戶希望可以隨時中上連接過程,那麼一般是用 非阻塞模式來做的. 看看我的這段連接代碼(節選),可以作為TCP連接的典範:
bool CRemoteLink::Connect()
{
OnDisconnected(); // 如果已經連接,則斷開
if(!m_bUseProxy)
{
m_iConnStatus = SS_CONNECTING; // 正在連接狀態
GNTRACE ("開始連接到遠程伺服器[%s][%ld]...\n", m_strip.c_str(), m_port);
// 建立套接字, 准備連接到伺服器
m_socket = ::socket(AF_INET, SOCK_STREAM, 0);
if (socket < 0) {
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);
return false;
}
// 設為非同步操作方式
unsigned long on = 1;
if (::ioctlsocket(m_socket, FIONBIO, &on) < 0) {
::closesocket(m_socket);
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);
return false;
}
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(m_strip.c_str());
addr.sin_port = htons(m_port);
int rt;
rt = ::connect(m_socket, (sockaddr *) &addr, sizeof(addr));
if (rt == 0) {
OnConnected();
return true;
}
// ==================================================================
timeval to;
// 首先建立連接
fd_set wfds;
fd_set efds;
FD_ZERO(&wfds);
FD_ZERO(&efds);
// test shutdown event each 100ms.
to.tv_sec = 0;
// CONNECT_TIMEOUT;
to.tv_usec = 100000;
int it = 0;
while(!m_meShutdown.Wait(0) && !m_meConnStop.Wait(0))
{
FD_SET(m_socket, &wfds);
FD_SET(m_socket, &efds);
int n = select(m_socket + 1, NULL, &wfds, &efds, &to);
if (n > 0) {
if(FD_ISSET(m_socket, &wfds))
{
OnConnected();
return true;
}
else
{
//int err = ::WSAGetLastError();
//const char* msg = GetLastErrorMessage(err);
GNTRACE ("CRemoteLink::Connect : connection attempt failed!\n");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CONN, MSG_SE_CONN);
break;
}
} else if (n < 0) { // Select Error
int err = ::WSAGetLastError();
const char* msg = GetLastErrorMessage(err);
GNTRACE ("CRemoteLink::Connect : Select Error.[%d] - %s\n", err, msg);
if(m_pCallBack)
m_pCallBack->OnSocketError(err, msg);
break;
}
else
{
it += 100;
if(it > 30000) // 連接超時 -- (30S)
{
GNTRACE ("CRemoteLink::Connect : Time out.\n");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_TIMEOUT, MSG_SE_TIMEOUT);
break;
}
}
}
if(m_meConnStop.Wait(0))
{
GNTRACE("連接過程進行時被取消。\n");
}
}
else
{
// 通過代理伺服器連接
⑵ 如何控制C#Socket的連接超時時間
1.使用BeginConnect方法
IAsyncResult
connResult
=
mySocket.BeginConnect(yourAddress,
yourPort,
null,
null);
connResult.AsyncWaitHandle.WaitOne(2000,
true);
//等待2秒
if
(!connResult.IsCompleted)
{
mySocket.Close();
//處理連接不成功的動作
}
else
{
//處理連接成功的動作
}
這種方法很好的控制了連接超時時間而且代碼非常簡單,但是界面仍然會有2秒的卡死產生。如果想解決該問題,則需要創建一個額外的線程來執行WaitOne方法。
2.使用ConnectAsync方法
SocketAsyncEventArgs
e
=
new
SocketAsyncEventArgs();
e.Completed
+=
new
EventHandler<SocketAsyncEventArgs>(AsyncConnected);
e.RemoteEndPoint
=
new
IPEndPoint(IPAddress.Parse(yourAddress),
yourPort);
⑶ socket怎麼設置超時
socket.setSoTimeout(int timeout);
恩。應該能實現你的要求
首先socket不是一個阻塞方法,它不會自動去連serverSocket,而是你connect一次它就去連一次,socket本身不存在什麼連接server端超時,所以客戶端的連接超時是由你的程序去控制的,比如用線程。
其次,惡意連接這個問題,其實我已經給你解決了,在server端拿到socket後,不就能用socket.setSoTimeout()來設置連接時間了么?
⑷ socket連接超時怎麼解決啊
調大timeout參數值。網路上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket。當socket連接超時調大timeout參數值,可以解決連接超時的問題。timeout就是連接等待的時間參數,把原來的等待時間調大即可。
⑸ 如何控制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));}}所有代碼見:http://blog.csdn.net/ang75/article/details/75915
⑹ 如何設置socket的Connect超時
針對套接字操作設置默認超時的概述StreamSocket類實現Windows運行時應用中的TCP套接字。TCP套接字必須建立連接才能發送或接收任何網路數據。Windows8.1、WindowsPhone8.1和WindowsServer2012中實現的基礎TCP套接字會針對所有的TCP連接套接字操作設置默認超時。對於每個來源和目標地址對,在使用主機名或終結點時,默認超時為3分鍾(180秒)。因此,如果目標主機名有兩個IP地址,那麼,只有在經過大約6分鍾之後,連接操作才會超時。對於使用Windows運行時應用的客戶體驗來說,這個默認超時可能過長。因此,使用StreamSocket類的應用可能希望針對流套接字連接操作設置較短的自定義超時。在發送或接收網路數據時,DatagramSocket和StreamSocket類沒有默認超時。因此,任何發送或接收操作都將永遠等待。使用套接字的Windows運行時應用可能希望針對這些操作設置超時以獲取更好的客戶體驗。StreamSocketListener類將永遠偵聽和等待傳入的連接請求。如何針對套接字操作設置自定義超時JavaScript語言支持計時事件,這些事件可以按指定的時間間隔執行某些代碼。JavaScript計時事件setInterval()-按指定的時間間隔(毫秒)反復執行某個函數。setTimeout()-在等待指定的毫秒之後執行一次某個函數。計時事件函數是在HTMLDOMWindow對象中實現的。WinJS命名空間為包括WinJS.Promise對象的JavaScript功能提供特殊的Windows庫。timeout(timeout,promise)方法包裝setTimeout函數。如果在timeout參數中指定的毫秒數內未完成承諾,則Windows應用商店應用可以使用timeout(timeout,promise)方法來取消此承諾。如果在timeout參數中指定的時間間隔內未完成套接字操作,則可以調用timeout(timeout,promise)方法並將套接字操作作為promise參數以使該操作超時。只要套接字操作仍在掛起,就能將其取消。WinJS.Promise對象和timeout(timeout,promise)方法可以與Windows運行時應用中的任何非同步操作一起使用,包括所有的非同步套接字操作。對於正常的完成操作,可以在timeout(timeout,promise)方法調用之後添加逗.then地。對於所有這三個類來說,使用超時的基本模型是相同的。以下討論使用StreamSocket上的連接操作作為示例。在使用DatagramSocket或StreamSocket對象發送或接收網路數據時,或者在使用StreamSocketListener對象偵聽傳入連接時,可以使用相同的模型來實現超時。創建一個StreamSocket。調用timeout(timeout,promise)方法並將其中一個StreamSocket.connectAsync方法作為promise參數。在源代碼的末尾添加then(successFunction,errorFunction)方法來處理成功和錯誤案例。在出錯時,關閉套接字。在取消StreamSocket操作承諾之後,將無法再使用已取消的StreamSocket。以下示例將針對StreamSocket連接操作實現自定義超時。JavaScriptvarclientSocket=null;vartimeout=10000;//10secondsfunctionopenClient(){varserverHostName=newWindows.Networking.HostName("");varserviceName="http";//displayStatus("Client:connectionstarted.");clientSocket=newWindows.Networking.Sockets.StreamSocket();//varpromise=clientSocket.connectAsync(serverHostName,serviceName)WinJS.Promise.timeout(timeout,clientSocket.connectAsync(serverHostName,serviceName).then(function(){//displayStatus("Client:connectioncompleted.");//Doyoursocketoperationshere.},function(reason){//:thepromisemighthave//timedout,,orthere//wasanTCPissue,orseveralotherpossibilities.//displayStatus("Client:connectionfailed.");//displayStatus(reason.message);clientSocket.close();clientSocket=null;}));}
⑺ Socket 連接 過程中超時問題的處理
根據公司需要最近所了一個廣播通信的項目,交給測試的時候發現在廣播的過程中經常會出現斷線的問題,回來自己親測確實有這樣的問題,但是很奇怪的是在下班後再去測試這樣的問題就基本不會出現 ,什麼原因呢很困惑 ,開始還懷疑是不是音頻錄入采樣參數設置出了什麼問題,最後確定不是,就分析是不是Socket連接出了問題 後來一看還真是。
你會看到這樣的錯誤:ErrorDomain=GCDAsyncSocketErrorDomain Code=4 "Read operation timed out"UserInfo=0xa8db6a0 {NSLocalizedDescription=Read operation timed out}
斷點調試出你自己的超時時間,系統給的設置是 if (timeout >= 0.0),只需要把你的超時時間修改為你調試出的超時時間大就OK了!