WSAEventSelectI/O模型中FD_WRITE事件的处理以及如何发送数据

网上很多人都在问什么时候才会触发FD_WRITE,触发了我该怎么发送数据,如果没有触发,我又该如何发数据?

当第一次连接成功的时候会触发FD_WRITE,还有就是当send 返回SOCKER_ERROR并且 WSAGetLastError()返回 WSAEWOULDBLOCK 这时表示缓冲区已满,当数据发送出去,又有空闲的缓冲区时会触发FD_WRITE,表示缓冲区可写。

也就是说第一次连接成功,表示你现在可以发送数据会触发FD_WRITE还有就是缓冲区有空闲空间的时候会触发FD_WRITE事件,这里有两种解释:

1.至于缓冲区是否满,得等到你发送数据的时候才知道因为可能你的系统里面,还有其他的网络程序在发送数据。

2.因为你才连接成功对于这个SOCKET而言你还没发数据,那么相对于这个SOCKET的缓冲器区,肯定是空闲的因为你还没发数据。

这里就涉及到缓冲区是每个SOCKET都有缓冲区还是所有SOCKET共享一个缓冲区,我个人觉得应该是每一个SOCKET都有一个缓冲区。

实际上send只是把发送的数据拷贝到缓冲区,并不是真正的已经发送完毕,真正的发送是底层调用网卡驱动把每个SOCKET的拷贝过来的缓冲区数据根据不同的IP地址和端口再进行发送。

如果是阻塞的模型下send直到把所有数据拷贝到缓冲区才返回,如果缓冲区满了那么就直接阻塞等待,这个就是为什么有时候send会阻塞一下才返回的原因。

行了跑题了,我们最关心的肯定是send的时候返回SOCKER_ERROR 并且 WSAGetLastError()返回 WSAEWOULDBLOCK 的时候如何发送数据。

不多说了直接上代码:

//
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值