套接字的属性

    以前我总是将是否处于阻塞模式和是否可以进行异步IO操作混淆起来。以前,我认为可以进行异步IO操作的套接字必然不是处于阻塞模式;处于阻塞模式的套接字无法进行异步IO操作。最新比较正规地学习win socket开发,终于分清这两个概念。

    其实,是否处于阻塞模式、是否可以进行异步IO操作是一个套接字上两个不相关的属性。

    首先,所有的winsock函数可以分成阻塞函数和非阻塞函数。

    套接字是否处于阻塞模式,只会影响阻塞函数的行为。阻塞函数是指,在套接字上调用该函数后,在某些条件下函数可能会阻塞住不会返回。例如,recv就是一个阻塞函数,如果当前套接字上没有数据,那么调用recv之后线程可能被阻塞住。如果一个套接字处于阻塞模式,在没有数据的情况下调用recv就会阻塞当前线程;如果一个套接字处于非阻塞模式,在没有数据的情况下调用recv后会立即返回,返回值为-1,错误码为WSAEWOULDBLOCK。

    对于非阻塞函数,比如bind, socket。无论套接字处于阻塞模式,还是处于非阻塞模式。非阻塞函数都不会阻塞当前线程。

    其次,是否指定WSA_FLAG_OVERLAPPED标识只影响异步IO操作函数的行为。

   一个套接字创建时是否指定WSA_FLAG_OVERLAPPED标识,不会影响bind, accept等阻塞函数的行为。异步IO函数,指的是那些具有LPOVERLAPPED参数的API,比如WSARecv, WSASend等。如果一个套接字不支持异步IO操作,在该套接字上调用WSARecv等异步IO函数,IO操作将以同步的方式执行。在同步执行的情况下,异步IO函数是否会阻塞调用线程与套接字是否处于阻塞模式有关。

    最后,所有的套接字默认处于阻塞模式。

    通过调用WSAAsyncSelect, WSAEventSelect, WSAIoctl可以改变套接字的模式。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值