网游服务器的数据接收机制讨论得比较多, 但发送机制的讨论就少得多了.
写数据和读数据一样, 都会涉及到超时关闭连接的问题. 但是, 读超时一般在应用层实现, 而不是在传输层实现. 一般的网游协议都会设计心跳机
制. 写超时不适合在应用层实现, 而应该在传输层实现. 数据的发送(写)操作如果处理不好, 会让服务器进程阻塞写操作上.
写操作的层次
1. 应用层写操作
应用层操作只是将数据拷贝到应用层的发送缓冲, 在缓冲未满的情况下总是立即返回. 当出现发送缓冲被填满的情况, 这就涉及到阻塞, 这也是本文的重
点, 在下面讨论.
2. 传输层写操作
一般指socket的write调用. socket也有其自己的发送缓冲, 在缓冲未满的情况下问题立即返回. 当出现socket的发送已满的情况
下, 也会涉及到阻塞.
实现机制:
1. 应用层发送可能出现阻塞的情况
应用层的写方法, 不应该阻塞, 通过出错机制告知发送缓冲已满, 而此时, 写方法的调用者检测到后, 关闭网络连接.
2. 传输层写操作可能出现阻塞的情况
当socket的write调用应该在检测到连接可写时才进行写操作, 保证不会出现阻塞. 但应该实现一种超时机制, 当发现某些数据超过一定时间仍
无法进行发送时, 关闭网络连接.
你现在看的文章是: 网游服务器端的数据发送机制的讨论