socket 中的超时处理笔记(其中也有 MFC 的CAsyncSocket和CSocket类 )

本文详细介绍了Socket在不同操作系统中如何设置为阻塞或非阻塞模式,并通过对比ioctl与fcntl函数的作用,解释了MFC中CAsyncSocket与CSocket类的工作原理及如何设置超时。

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

1.在我们直接调用socket创建时,如果不进行特意声明的话,创建的socket都是阻塞的。这样当我们调用accept,recv时,将有可 能“block”,如果想设置为非阻塞,则方法有调用fcntl,select,WSAAsynSelect 来改变socket的阻塞

hsocket = socket(AF_INET, SOCK_STREAM, 0)

fcntl(hsocket, F_SETFL, 0_NONBLOCK);

 

注意:

    其中fcntl是Unix系统环境中使用的,使用ioctl()函数和fcntl()函数实现对套接字的控制,而在Windows系统中则应使用 ioctlsocket()函数。

 Ioctl和fcntl的区别是:

  ioctl   -   control   device  
  ioctl()   performs   a   variety   of   control   functions     on     devices  
            and   STREAMS.     For   non-STREAMS   files,   the   functions   performed  
            by   this   call   are   device-specific   control   functions.     request  
            and     an   optional   third   argument   with   varying   type   are   passed  
            to   the   file   designated   by   fildes   and   are   interpreted   by     the  
            device   driver.  
    The   fcntl()   function   provides   control   of   open   file   descriptors.   It   is   similar   to   ioctl().

   ( 这些带着unix的体味的函数,看着就头大。这个我是摘自某个文档,设置超时应该采用ioctlsocket。)

 

1.调用MFC的CAsyncSocket和CSocket类

  MFC提供了两个类CAsyncSocket和CSocket来封装WinSock API,

  CAsyncSocket在较低层次上封装了WinSock API,缺省情况下,使用该类创建的socket是非阻塞的socket,所有操作都会立即返回,如果没有得到结果,返回WSAEWOULDBLOCK, 表示是一个阻塞操作。

  CSocket建立在CAsyncSocket的基础上,是CAsyncSocket的派生类。也就是缺省情况下使用该类创建的socket是非阻塞的 socket,但是CSocket的网络I/O是阻塞的,它在完成任务之后才返回。CSocket的阻塞不是建立在“阻塞”socket的基础上,而是在 “非阻塞”socket上实现的阻塞操作,在阻塞期间,CSocket实现了本线程的消息循环,因此,虽然是阻塞操作,但是并不影响消息循环,即用户仍然 可以和程序交互。(即程序不会freeze)。

  其中设置超时函数如下:

CAsyncSocket::SetSockOpt(   int   nOptionName,   const   void*   lpOptionValue,   int   nOptionLen,   int   nLevel   =   SOL_SOCKET   );  
  nOptionName用SO_SNDTIMEO   or   SO_RCVTIMEO。 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值