L
leaber
Unregistered / Unconfirmed
GUEST, unregistred user!
好多朋友在问这个问题,希望我的文档能对大家有所帮助~~!!
CONNECT 连接超时解决方案
和send recv 超时解决方案
leaber
2004-10-12整理测试
做网络程序中会经常见到判断CONNECT超时的问题,解决的思路是这样的,
首先把要连接服务器的SOCKET转换为非阻塞方式后进行连接,然后利用
时间差值来判断是否超时。
如果成功的话就把SOCKET再设为阻塞方式,当然如果超时的话你就看着办吧!
时间差值的计算方式有好多种,我的实现方式是以SELECT来实现的.
===============这里是我成功测试的代码==========================
Skt := Socket(AF_INET, 1, 0);
ca.sin_family := AF_INET;
ca.sin_port := htons(80);
FD_ZERO(fs);
FD_SET(skt, fs);
timeout.tv_sec := 10;
timeout.tv_usec := 500;
//在这里完成CONNECT超时检查的功能
ulB := 1;
ioctlsocket(Skt, FIONBIO, ulB);
if Connect(skt, ca, sizeof(ca)) = SOCKET_ERROR then
begin
if (WSAGetLastError() = WSAEWOULDBLOCK) then
begin
FD_ZERO(fs);
FD_SET(skt, fs);
rc := select(0, nil, @fs, nil, @Timeout);
end;
end;
if rc = 0 then
begin
//ShowMessage('connect overtime!');
CloseSocket(skt);
exit;
end;
ulB := 0;
ioctlsocket(Skt, FIONBIO, ulB);
//CONNECT 超时功能结束
通过SETSOCKOPT可以完成对RECV和SEND相应的超时设置!
//完成SETSOCKOPT 进行相应的发送和接收的超时
timeout1 := 5000;
if SetSockOpt(skt, SOL_SOCKET, SO_SNDTIMEO, pchar(@TimeOut1), SizeOf(TimeOut1)) <> 0
then
Exit;
if SetSockOpt(skt, SOL_SOCKET, SO_RCVTIMEO, pchar(@TimeOut1), SizeOf(TimeOut1)) <> 0
then
Exit;
CONNECT 连接超时解决方案
和send recv 超时解决方案
leaber
2004-10-12整理测试
做网络程序中会经常见到判断CONNECT超时的问题,解决的思路是这样的,
首先把要连接服务器的SOCKET转换为非阻塞方式后进行连接,然后利用
时间差值来判断是否超时。
如果成功的话就把SOCKET再设为阻塞方式,当然如果超时的话你就看着办吧!
时间差值的计算方式有好多种,我的实现方式是以SELECT来实现的.
===============这里是我成功测试的代码==========================
Skt := Socket(AF_INET, 1, 0);
ca.sin_family := AF_INET;
ca.sin_port := htons(80);
FD_ZERO(fs);
FD_SET(skt, fs);
timeout.tv_sec := 10;
timeout.tv_usec := 500;
//在这里完成CONNECT超时检查的功能
ulB := 1;
ioctlsocket(Skt, FIONBIO, ulB);
if Connect(skt, ca, sizeof(ca)) = SOCKET_ERROR then
begin
if (WSAGetLastError() = WSAEWOULDBLOCK) then
begin
FD_ZERO(fs);
FD_SET(skt, fs);
rc := select(0, nil, @fs, nil, @Timeout);
end;
end;
if rc = 0 then
begin
//ShowMessage('connect overtime!');
CloseSocket(skt);
exit;
end;
ulB := 0;
ioctlsocket(Skt, FIONBIO, ulB);
//CONNECT 超时功能结束
通过SETSOCKOPT可以完成对RECV和SEND相应的超时设置!
//完成SETSOCKOPT 进行相应的发送和接收的超时
timeout1 := 5000;
if SetSockOpt(skt, SOL_SOCKET, SO_SNDTIMEO, pchar(@TimeOut1), SizeOf(TimeOut1)) <> 0
then
Exit;
if SetSockOpt(skt, SOL_SOCKET, SO_RCVTIMEO, pchar(@TimeOut1), SizeOf(TimeOut1)) <> 0
then
Exit;