connect 、recv、send 超时解决方案

问题:经验分享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;
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值