读书人

100分求clientsocket open超时的有关问

发布时间: 2012-02-04 15:43:09 作者: rapoo

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

读书人网 >.NET

热点推荐