如何設定socket通訊的連線超時
在建立socket連線時可以很容易設定socket通訊的傳送和接收超時時間,但是在建立socket通訊時,如果是Win98系統,則如果連線失敗,則程式會一直等待在哪裡,Windows2000預設超時時間是30秒,當然,這個超時時間不算長,但是加入我們要迴圈掃描一系列埠並且建立連線的話,總的等待時間就會讓人忍受不了,下面就以delphi為例進行說明,如何在建立socket的時候設定其超時時間:
//連線,傳送和接收時間都設為2秒
SctTimeOut := 2000;
//設定接收資料通訊超時
setsockopt(hSock,SOL_SOCKET,SO_RCVTIMEO,@SctTimeOut,SizeOf(Integer));
//設定傳送資料通訊超時
setsockopt(hSock,SOL_SOCKET,SO_SNDTIMEO,@SctTimeOut,SizeOf(Integer));
//首先,設定通訊為非阻塞模式
dwArg := 1;
RecvLen := ioctlsocket(hSock,FIONBIO,dwArg);
//其次,連線伺服器
ZeroMemory(@addr, sizeof(addr));
addr.sin_family := AF_INET;
addr.sin_addr.S_addr := inet_addr(pchar(SvrIP));
addr.sin_port := htons(Strtoint(SvrPort));
RecvLen := 0;
RecvLen := connect(hSock, addr, sizeof(addr));
//再次,設定連線超時時間為2秒
tmOut.tv_sec := 2;
tmOut.tv_usec := 0;
FD_ZERO(recvSet);
FD_SET(hSock, recvSet);
RecvLen := select(0, @recvSet, @recvSet, nil, @tmOut);
//連線失敗,報錯誤資訊
if (RecvLen = 0) or (RecvLen = SOCKET_ERROR) then
begin
ErrMsg := '連線伺服器失敗!';
exit;
end;
//最後,設定通訊為阻塞模式
dwArg := 0;
RecvLen := ioctlsocket(hSock,FIONBIO,dwArg);
//end modify