MSDN上关于SocketAsyncEventArgs的范例,是建立了一个SocketAsyncEventArgs缓冲池,每个连接只使用一个SocketAsyncEventArgs,在发送和接受状态下来回切换,因为SocketAsyncEventArgs有个特性在上次异步过程结束前不能再次进步异步操作,否则就报异常(现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作)。但是这种单个SocketAsyncEventArgs来回切换状态的做法,不能解决一个问题,就是有时候客户端没有发送任何请求时,服务器必须向客户端推送消息,因为此时SocketAsyncEventArgs本身处于ReceiveAsync模式,因此不能向客户端进行异步send,只能重新new一个SocketAsyncEventArgs对象。,但是临时new对象就违背了性能原则,我现在就希望也专门做一个用于send的SocketAsyncEventArgs缓存池,当一个socket需要send的时候就取一个出来用,但是存在以下几个问题:
*.类似聊天室这样完全由服务器向客户端群发每个客户发来的消息的应用场合,很可能网络繁忙,上一个SendAsync还没完成,就需要再次发送,也就是说此时有多个SocketAsyncEventArgs被取出用于一个socket的send任务,那么这些SocketAsyncEventArgs自动排队的吗?会不会出现本来应该后发的消息,却被先发了出去
*.SocketAsyncEventArgs只有处于ReceiveAsync时能够比较容易的得到客户端是否断开连接了,但是我不知道SocketAsyncEventArgs处于SendAsync的状态时,如果网络突然断了,或者客户端断开连接了,SocketAsyncEventArgs会返回吗,还是一直等在那里?,如果一直等在那里,那就出现卡死了
如果各位有基于SocketAsyncEventArgs设计的范例,且范例能满足我文中提到的,服务端主动向客户端推送的案例,希望能告知,目前msdn官方范例就是没能实现再监听客户端的同时向客户端推送消息