100分求clientsocket open超时的问题。
在开发程序中,引用了delphi的clientsocket控年。在使用中发现,如果对方的的server端没有开起来。或是主机名根本不存在,或是端口也不存在。在调用clientsocket.open时,要大约过了45秒才出现报错。能否修改这个时间。只需3秒就行了。
在这里找了许多贴子都不能解决。用GetTickCount()也不行。能否有代码。尽量不要用到winsock.setsockopt,如果有,能否提供代码。
[解决办法]
非堵塞模式,先设为非堵塞,再改为堵塞
- Delphi(Pascal) code
procedure TForm1.Button2Click(Sender: TObject);var ListenSocket: TSocket; Addr: TSockAddr; Len: Integer; WsaData: TWSADATA; Arg: DWORD; Timeval: TTimeVal; FdRead: TFDSet;begin if WSAStartup(MAKEWORD(2, 2), WsaData) <> 0 then begin WSACleanup; Exit; end; ListenSocket := WSASocket(AF_INET, SOCK_STREAM, 0, nil, 0, WSA_FLAG_OVERLAPPED); if ListenSocket = INVALID_SOCKET then begin ShowMessage(SysErrorMessage(WSAGetLastError)); Exit; end; addr.sin_family := AF_INET; addr.sin_addr.s_addr := inet_addr('127.1.0.1'); addr.sin_port := htons(1002); Len := SizeOf(TSockAddr); Arg := 1; if Socket_error = ioctlsocket(ListenSocket, FIONBIO, Arg) then begin closesocket(ListenSocket); WSACleanup; Exit; end; FD_ZERO(FdRead); FD_SET(ListenSocket, FdRead); Timeval.tv_sec := 0; Timeval.tv_usec := 60; connect(ListenSocket, PSockAddr(@addr), len); if (select(0, 0, @FdRead, 0, @Timeval) <= 0) then begin closesocket(ListenSocket); WSACleanup; ShowMessage('超时'); Exit; end; Arg := 0; ioctlsocket(ListenSocket, FIONBIO, Arg); WSACleanup;end;
[解决办法]
http://topic.csdn.net/u/20100110/21/e9fcdd35-3962-47ad-aa92-f9f7fe9e4526.html?65079
用我这个,包你Ok