connect 、recv、send 超时解决方案

来源:互联网 发布:网络通信设备的名字 编辑:程序博客网 时间:2024/05/16 03:32
问题:经验分享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;
  

原创粉丝点击