socket模式和模型概念
2016-09-06 22:33
281 查看
当使用socket()函数和WSASocket()函数创建套接字时,默认的套接字都是阻塞的。
1 一个套接字是阻塞的,那么它的recv()、recvfrom()、WSARecv()和WSARecvfrom()、send()、sendto()、WSASend()和WSASendto()、accept()和WSAAcept()、connect()和WSAConnect()函数就是阻塞的.
一个套接字是非阻塞的,那么它的recv()、recvfrom()、WSARecv()和WSARecvfrom()、send()、sendto()、WSASend()和WSASendto()、accept()和WSAAcept()、connect()和WSAConnect()函数就是非阻塞的.
2 套接字模式与I/O模型的关系:
套接字模式是定义一个SOCKET的行为方式.阻塞的SOCKET, 它在执行SEND时,发送不成功,SEND函数不会返回,程序也就不能向下执行. 非阻塞send, 成功不成功都返回,根据返回值来判断是否成功.如果不成功,你还要继续的调用.
I/O模型是当你的程序中有多个SOCKET的话, 如何管理它们以让他们达到最高的工作效率.
比如说wsasyncselect模型, 把一个socket和一个windows procedure联系起来,把这个socket设成非阻塞的,它send了一个数据返回了,即使他不成功,你也不用再来调用了,当它可以发送时,OS会给windows procedure发消息的.
如果你把它改成阻塞的了,那么你就失去了使用I/O模型的意义了.
<1>
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);//默认为阻塞模式
ioctlsocket(s,FIONBIO,1);//s被设置为非阻塞模式
send(s,buf,len,flags);//s被设为非阻塞模式后,直至再次把s设为阻塞前,其后续操作如send,recv等都是非阻塞的。
<2>
SOCKET s;
s = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);//s被允许重叠IO
WSASend(s,buf,1,numberOfBytesSent,flag,overlapped,NULL);//在重叠套接字上的操作,如WSASend,WSARecv等,如果填写了overlapped结构作为参数,都是重叠IO操作的。同时,这些操作也是非阻塞的,不需要显式调用ioctlsocket。(另一个解释:若随一个
WSAOVERLAPPED 结构一起调用这些函数,WSASend、WSASendTo、WSARecv、WSARecvFrom、WSAIoctl、AcceptEx、TrnasmitFile、函数会立即完成并返回,无论套接字是否设为阻塞模式。此时这些函数就默认相当于非阻塞模式了)
1 一个套接字是阻塞的,那么它的recv()、recvfrom()、WSARecv()和WSARecvfrom()、send()、sendto()、WSASend()和WSASendto()、accept()和WSAAcept()、connect()和WSAConnect()函数就是阻塞的.
一个套接字是非阻塞的,那么它的recv()、recvfrom()、WSARecv()和WSARecvfrom()、send()、sendto()、WSASend()和WSASendto()、accept()和WSAAcept()、connect()和WSAConnect()函数就是非阻塞的.
2 套接字模式与I/O模型的关系:
套接字模式是定义一个SOCKET的行为方式.阻塞的SOCKET, 它在执行SEND时,发送不成功,SEND函数不会返回,程序也就不能向下执行. 非阻塞send, 成功不成功都返回,根据返回值来判断是否成功.如果不成功,你还要继续的调用.
I/O模型是当你的程序中有多个SOCKET的话, 如何管理它们以让他们达到最高的工作效率.
比如说wsasyncselect模型, 把一个socket和一个windows procedure联系起来,把这个socket设成非阻塞的,它send了一个数据返回了,即使他不成功,你也不用再来调用了,当它可以发送时,OS会给windows procedure发消息的.
如果你把它改成阻塞的了,那么你就失去了使用I/O模型的意义了.
<1>
SOCKET s;
s = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);//默认为阻塞模式
ioctlsocket(s,FIONBIO,1);//s被设置为非阻塞模式
send(s,buf,len,flags);//s被设为非阻塞模式后,直至再次把s设为阻塞前,其后续操作如send,recv等都是非阻塞的。
<2>
SOCKET s;
s = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);//s被允许重叠IO
WSASend(s,buf,1,numberOfBytesSent,flag,overlapped,NULL);//在重叠套接字上的操作,如WSASend,WSARecv等,如果填写了overlapped结构作为参数,都是重叠IO操作的。同时,这些操作也是非阻塞的,不需要显式调用ioctlsocket。(另一个解释:若随一个
WSAOVERLAPPED 结构一起调用这些函数,WSASend、WSASendTo、WSARecv、WSARecvFrom、WSAIoctl、AcceptEx、TrnasmitFile、函数会立即完成并返回,无论套接字是否设为阻塞模式。此时这些函数就默认相当于非阻塞模式了)
相关文章推荐
- Delphi各种Socket组件的模式和模型
- 网络编程之 Socket的模式(二) --- “Linux网络I/O模型”
- socket基本概念及网络协议模型
- 网络编程之 Socket的模式(三) --- “Window网络I/O模型”
- 网络编程之 Socket的模式(四) --- “Window网络I/O模型” 续
- 网络编程之 Socket的模式(三) --- “Window网络I/O模型”
- 转:Delphi各种Socket组件的模式和模型
- 概念模型——分析模式学习笔记
- 网络编程之 Socket的模式(四) --- “Window网络I/O模型” 续
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]
- 网络编程之 Socket的模式(二) --- “Linux网络I/O模型”
- 分析模式:概念模型
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]
- 有关开发模式的几个概念-瀑布模型,极限编程,敏捷开发
- 8_14 日学到的新知识(简单的工厂模式的实现, MVC 模式的基本概念,软件工程中的四种开发模型, 以及软件工程中的一些小知识点)
- 概念模型——分析模式学习笔记
- 实体关系模型, 概念模型,Domain Model, UML建模(*** Diagram) --- 有点晕
- 手把手教你玩转SOCKET模型之重叠I/O篇(下)
- 手把手教你玩转SOCKET模型之重叠I/O篇
- MVC设计模式(模型-视图-控制器)设计模式介绍(ZZ)