问题:经验分享1: connect 、recv、send 超时解决方案 ( 积分:0, 回复:19, 阅读:756 ) 分类:Internet/TCPIP ( 版主:luyear, robertcool ) | |
来自:leaber, 时间:2005-6-7 17:34:00, ID:3097068 | [显示:小字体 | 大字体] |
好多朋友在问这个问题,希望我的文档能对大家有所帮助~~!!
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 、recv、send 超时解决方案
最新推荐文章于 2023-02-26 23:45:34 发布