完成端口模型与非阻塞模式的关系是什么呢?

beacon_hu 2008-08-31 09:56:15
1。是不是用了“完成端口模型”就是“非阻塞模式”了呢?
如果是的话,那为什么在“完成端口模型”中没看到ioctlsocket呢?

2。非阻塞模式有那么多的好处,那么为什么需要阻塞模式呢?什么时候需要用到阻塞模式呢?

谢谢!!!
...全文
289 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beacon_hu 的回复:]
<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…
[/Quote]
你好,我最近也在学习socket,遇到了和你一样的疑问。感觉你说的有些问题吧,怎么我在调试状态下,发现没有经过Ioctlsocket设置非阻塞模式的就是阻塞的,不是设置了Overlapped标志就是非阻塞的了。我都搞糊涂了。到底怎么回事。感觉1楼的说得还是蛮准确的。
JazzDynasty 2008-08-31
  • 打赏
  • 举报
回复
完成端口中使用的是重叠I/O模型,而重叠I/O摸型本来用的就是得非阻塞模式。
普通套接字创建后默认为阻塞模式,阻塞模式的套接字用于少量数据接收和发送的简单网络程序开发。
yyunffu 2008-08-31
  • 打赏
  • 举报
回复
套接字的模式和模型是两回事。
模式指套接字相关API本身行为是阻塞或非阻塞。而IO模型是为了弥补套接字模式的某些不足而出现的。
WinEggDrop 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 beacon_hu 的帖子:]
1。是不是用了“完成端口模型”就是“非阻塞模式”了呢?
如果是的话,那为什么在“完成端口模型”中没看到ioctlsocket呢?

2。非阻塞模式有那么多的好处,那么为什么需要阻塞模式呢?什么时候需要用到阻塞模式呢?

谢谢!!!
[/Quote]

1.完成端口模型,如果用于网络socket的话,将socket加入到完成端口中处理,socket就是非阻塞并且是支持重叠I/O操作的了.但完成端口模型并一定是用于网络socket,因为这模型面向的是句柄,所以一样可以处理文件等,如果说要处理的是文件句柄等,那你的问题就不成立了.

2.
A.阻塞模式简单,易用,对于初学者容易上手.
B.编写同类型的程序,一般程序员使用完成端口模型无论在编写还是维护上,都要花费更长的时间(除非是使用完成端口模型的高手).在商言商,开长和维护时间更短,更简单,节省更多成本.
C.并不是所有程序都需要使用完成端口模型的,如果一般的阻塞模式也能很好地工作,那么用完成端口模型是"大材小用".
JazzDynasty 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 beacon_hu 的回复:]
<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…
[/Quote]
完全正确!
yyunffu 2008-08-31
  • 打赏
  • 举报
回复
没错,是你注释那样。
beacon_hu 2008-08-31
  • 打赏
  • 举报
回复
<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。

以上注释是我的理解。是这样吗?




jameshooo 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 JazzDynasty 的回复:]
完成端口中使用的是重叠I/O模型,而重叠I/O摸型本来用的就是得非阻塞模式。
普通套接字创建后默认为阻塞模式,阻塞模式的套接字用于少量数据接收和发送的简单网络程序开发。
[/Quote]

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧