如何设置socket通信的连接超时

本文介绍如何在Delphi中设置Socket连接、发送和接收的超时时间,通过非阻塞模式实现快速连接扫描,避免长时间等待。适用于需要频繁扫描端口的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在建立socket连接时可以很容易设置socket通信的发送和接收超时时间,但是在建立socket通信时,如果是Win98系统,则如果连接失败,则程序会一直等待在哪里,Windows2000默认超时时间是30秒,当然,这个超时时间不算长,但是加入我们要循环扫描一系列端口并且建立连接的话,总的等待时间就会让人忍受不了,下面就以delphi为例进行说明,如何在建立socket的时候设置其超时时间:

  //连接,发送和接收时间都设为2秒

  SctTimeOut := 2000;
  //设置接收数据通信超时
  setsockopt(hSock,SOL_SOCKET,SO_RCVTIMEO,@SctTimeOut,SizeOf(Integer));
  //设置发送数据通信超时
  setsockopt(hSock,SOL_SOCKET,SO_SNDTIMEO,@SctTimeOut,SizeOf(Integer));

  //首先,设置通讯为非阻塞模式
  dwArg := 1;
  RecvLen := ioctlsocket(hSock,FIONBIO,dwArg);

  //其次,连接服务器
  ZeroMemory(@addr, sizeof(addr));
  addr.sin_family := AF_INET;
  addr.sin_addr.S_addr := inet_addr(pchar(SvrIP));
  addr.sin_port := htons(Strtoint(SvrPort));
  RecvLen := 0;
  RecvLen := connect(hSock, addr, sizeof(addr));

  //再次,设置连接超时时间为2秒
  tmOut.tv_sec := 2;
  tmOut.tv_usec := 0;
  FD_ZERO(recvSet);
  FD_SET(hSock, recvSet);
 
  RecvLen := select(0, @recvSet, @recvSet, nil, @tmOut);

 //连接失败,报错误信息

   if (RecvLen = 0) or (RecvLen = SOCKET_ERROR) then
  begin
    ErrMsg := '连接服务器失败!';
    exit;
  end;

  //最后,设置通讯为阻塞模式
  dwArg := 0;
  RecvLen := ioctlsocket(hSock,FIONBIO,dwArg);
  //end modify 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值