本文章针对的网络库antnet
这里不讲什么粘包,消息头设计之类的事情,这种问题应该是百度一下就能解决的问题。
下文中的msgque代指antnet中的消息队列。
第一个问题是TCP连接的关闭时机,通常我们在设计网络框架时如果read返回0或者出错就会关闭连接,但这样的做法其实稍显草率,因为TCP时全双工的,不能读不代表不能写,所以正常情况我们应该尝试一下把写消息队列你们的数据发送一下,发送完毕或者出错时再关闭连接。
第二个问题是发送组播及广播消息,当然最简单的就是for循环发送,但是for循环发送往往会有一些问题,比如一个socket的写缓冲区满了那么肯定会造成整个消息的发送延迟,第二个是需要维护for循环的map或者list,当有N个组播需要处理时就比较麻烦。
对于此问题我采用的做法是利用channel的通知机制,当关闭一个channel时会导致所有的监听者激活,这样就能实现广播消息了。
首先定义广播消息的队列,这里我们定义了最大65535个广播消息,对一般应用来说完全够用,接下来是发送广播消息的函数
相应的,在每个msgque里面有监听接口,这样能保证处理时msgque肯定是有效的,关闭的肯定就不会监听了嘛。
也许你会疑惑65535个消息是否够用,但仔细看看上面的发送函数,即时出现某个msgque出现卡死,并且错过了65535个全局消息会怎么样呢,这种情况下只会丢失一部分消息,而不会造成panic之类更严重的问题。
在则,一个消息队列能卡住那么长时间说明必然有地方有问题。
对于组播实现,antnet中直接复用了全局消息的机制,毕竟有65535个信息,在我们实际应用中全局消息根本没有那么多,便直接复用了全局消息机制,仅仅只需要多执行一个过滤函数,非常快速。