套接字的属性 .(套接字默认为阻塞的)
2013-12-18 21:10
10 查看
以前我总是将是否处于阻塞模式和是否可以进行异步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可以改变套接字的模式。
其实,是否处于阻塞模式、是否可以进行异步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可以改变套接字的模式。
相关文章推荐
- 非阻塞TCP套接字的要点 发表于 2015-04-22 | 分类于 网络编程 | 套接字的默认状态是阻塞的。如果一个套接字不能立即完成相应的调用,那么该线程就会被投入睡眠,等待相应的操
- 将套接字设置为非阻塞状态
- Struts2理解--动态方法和method属性及通配符_默认Action
- 客户端代理使用细节【函数调用/回调函数的完整签名及WebService级别默认属性】
- 如何设置属性为默认的绑定属性
- input 的属性autocomplete 默认为on 其含义代表是否让浏览器自动记录之前输入的值 很多时候,需要对客户的资料进行保密,防止浏览器软件或者恶意插件获取到 可以在input中加入a
- IIS 右健“默认网站”属性会提示 “发生意外错误0x800cc801" 服务没有及时响应启动和控制请求
- 自定义右键属性覆盖浏览器默认右键行为实现代码
- android默认的属性修改:
- VS2010 项目属性的默认包含路径的两种设置方法
- java中为什么接口中的属性和方法都默认为public?
- 设置阻塞或非阻塞套接字
- HTML默认样式表CSS属性
- 4.1.2 设置套接字的阻塞模式
- IOS中使用网页时input去除默认样式的两个属性
- 修改节点的属性 节点默认不允许修改
- 忆龙2009:windows xp sp3 新版802.1x客户端默认属性改变引起的认证失败
- 套接字的阻塞模式和非阻塞模式
- Java接口中属性和方法的默认修饰符
- input 标签 修改 disabled 属性默认样式(适配安卓 IOS)