网上很多人都在问什么时候才会触发FD_WRITE,触发了我该怎么发送数据,如果没有触发,我又该如何发数据?
当第一次连接成功的时候会触发FD_WRITE,还有就是当send 返回SOCKER_ERROR并且 WSAGetLastError()返回 WSAEWOULDBLOCK 这时表示缓冲区已满,当数据发送出去,又有空闲的缓冲区时会触发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 的时候如何发送数据。
不多说了直接上代码:
//