日期:2014-05-18  浏览次数:21333 次

C# 异步Socket SocketAsyncEventArgs的疑惑
我在写服务器程序时遇到个问题,没想明白。
连接后。
使用SendAsync发送
使用ReceiveAsync接收
都会响应Completed的回调,这很正常。

我的服务端程序有这样一个需求:
连接后,服务器常态应处于ReceiveAsync状态,因为这样可以捕捉到客户端关闭连接的动作。
但有时又想给客户端发送数据,使用SendAsync时,会出现“现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作。”
这可能是因为在做ReceiveAsync操作时,客户端没有发数据,没有完成操作。直接SendAsync会因为ReceiveAsync的操作没有完成而产生异常。

请问我该如何实现这种需求?
是否有方法撤销上次的ReceiveAsync操作?


------解决方案--------------------
探讨
引用:
如果想捕捉到客户端关闭连接的动作 那就是用心跳包的形式 客户端每个一段时间想服务器请求一次
证明自己在线 一旦一段时间内无请求 服务器就可以捕捉到 这样就不会出现你遇到的问题!

不要太过于依赖.NET提供的方法,虽然说它已经被封装的很好了,但是有时候实际应用中根据不同的
情况使用不同的解决方案 往往更佳!


谢谢您。

您的方法我……

------解决方案--------------------
探讨
连接后,服务器常态应处于ReceiveAsync状态,因为这样可以捕捉到客户端关闭连接的动作。
但有时又想给客户端发送数据,使用SendAsync时,会出现“现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作。”
这可能是因为在做ReceiveAsync操作时,客户端没有发数据,没有完成操作。直接SendAsync会因为ReceiveAsync的操作没有完成而产生异常。