• 1. 网络通信相关总结夏勃 2012年4月5日
  • 2. 数据通信的可靠性将发送接收的数据写入文件,通过对比文件来验证。 出现的问题: 客户端发送过于频繁时,服务器接收的数据有错 多个客户端连接时,客户端接收服务器群发的数据有错
  • 3. 服务器接收的数据错误send之前先select 禁用Nagle算法 在单客户端连接时有效,多客户端时还是有出错的情况 更换测试用网络环境 之前使用的无线网络,达不到频繁send的要求
  • 4. 客户端接收的数据错误服务器待发送消息积压,会导致数据包被覆盖 客户端接收发送不平衡,需要接受的数据多 改变客户端接收消息的方式
  • 5. 断线检测和重连正常断线:服务器或客户端进程结束,另一端能得到TCP的通知,可以立即检测出掉线 非正常断线:网线被拔掉等故障。TCP需要一定时间才能检测到掉线。
  • 6. 非正常断线的检测客户端: 每次send之前先select,当非正常掉线之时,select会不断的返回超时,send会返回WSAEWOULDBLOCK。在正常情况下,select超时不会连续太多次,可以以此来判断。 接收线程中recv之前先select,结合超时机制和recv进行判断
  • 7. 非正常断线的检测(续)客户端 接收线程为static成员,要在delete该类的实例不能保证该线程会退出。 主线程检测到断线之后,设置接收线程退出标志。 接收线程只退出线程,不做重连处理。而主线程中的send失败后可直接重连或者返回错误给上一层
  • 8. 非正常断线的检测(续)服务器: 监听线程通过recv检测,断线检测可能不及时 群发线程通过send数据包和send特殊的ping消息检测 群发监听线程中的超时机制 监听线程删除客户端,然后退出线程,其他二者只删除客户端。
  • 9. 重连中的问题服务器收到undefined message 来自于掉线的socket对应的监听线程 由于客户端已经掉线,socket中最后几个包没法向客户端确认 忽略
  • 10. 重连中的问题(续)客户端收到undefined message 仅出现在服务器群发线程在发送数据时,客户端掉线 客户端重连后服务器发送队列中遗留有若干消息
  • 11. 重连中的问题(续)客户端收到undefined message 发现群发监听线程被阻塞 设置send超时
  • 12. 错误处理错误日志记录 Socket通信错误 记录客户端掉线,删除客户端 消息存储队列满