WSAAsyncSelect 模型write事件的问题?

wileyking 2011-04-14 11:07:31
Recv事件很好理解, 当缓冲区有数据可读时, 会产生这个事件, 我们直接调用recv函数即可。
可是write事件呢,我知道当send 时缓冲区满会会产生write事件,我们可以再次调用send 发送。是这样的吧?

我们一般是先主动调send函数发送数据,此时会产生wirte事件吗?如果产生这个write事件有什么用呢?数据已经发送出去了。

谁能详细的解答一下啊 ??






...全文
86 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijianli9 2011-04-14
  • 打赏
  • 举报
回复
2楼回答的很完美。
Eleven 2011-04-14
  • 打赏
  • 举报
回复
对FD_WRITE 事件通知进行处理。只有在三种条件下,才会发出FD_WRITE通知:
1. 使用connect或WSAConnect,一个套接字首次建立了连接。
2. 使用accept或WSAAccept,套接字被接受以后。
3. 若send、WSASend、sendto或WSASendTo操作失败,返回了WSAEWOULDBLOCK错误,而且缓冲区的空间变得可用。

因此,作为一个应用程序,自收到首条FD_WRITE消息开始,便应认为自己必然能在一个
套接字上发出数据,直至一个send、WSASend、sendto或WSASendTo返回套接字错误WSAEWOULDBLOCK。经过了这样的失败以后,要再用另一条FD_WRITE通知应用程序再次发送数据。
smwhotjay 2011-04-14
  • 打赏
  • 举报
回复
write一般不用关心. 只要连上了,尽管发送好了. 不会出什么问题.
send完查看return 值就知道是否成功了
smwhotjay 2011-04-14
  • 打赏
  • 举报
回复
额,我遇到过一个鸟,他把socket比喻成pipe...
大海啊全是水 2011-04-14
  • 打赏
  • 举报
回复
write事件 会在两种情况下产生
1、当连接成功的时候
2、当发送的底层缓冲区满了以后,缓冲区的数据发送出去了,可以继续发送了,就会产生。
就像一个漏斗那样 如果漏斗的上面加水加的很快的话 那么漏斗就容易满。漏斗下面慢慢的流水,当漏斗满了以后,漏斗上面再加水的话 就会产生wouldblock的错误,这个时候等漏斗把他的放掉一些以后,漏斗认为可以再接收水了,那么就会产生WRITE事件,你就可以继续加水。
smwhotjay 2011-04-14
  • 打赏
  • 举报
回复
write 只是告诉你发送缓冲区没满,可以发送.这个意思
wileyking 2011-04-14
  • 打赏
  • 举报
回复
也就是 WSAAsyncSelect 模型 write 基本上用处不大了?? 要发送数据还是要主动send发送了??

18,356

社区成员

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

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