1

我在理解.net 中的异步套接字通信模型时有点噩梦。有人可以告诉我 ReadCallBack 方法何时被调用(我正在使用异步服务器侦听端口)(如果需要,下面的 MS 链接可获取完整代码)

//handler is my server socket handler
handler.BeginReceive( state.buffer, 0, StateObject.BufferSize,
 0,new AsyncCallback(ReadCallback), state);

即当它*完成*接收数据或当它*检测到*一些数据正在进入时。换句话说,当 ReadCallBack 确实被调用时,它如何知道数据不再到达?如果数据不断到达,ReadCallBack 会一直被调用吗?我的意思是它不像我的客户正在发送类似“\n”分隔符的东西,那么我如何在 readcallback 方法中检查一行中发送的内容?我的客户端实际上每 10 秒发送一次 ping(iAmAlive ping),除了第一次连接时的单个“hello_My name is”消息。

谢谢

这是我试图了解Microsoft Async Server 套接字示例的示例

4

3 回答 3

2

如果您告诉回调,回调就知道不再有数据到达。您可以使用状态对象来做到这一点。如果您检查您在ReadCallback()方法中链接的示例,则检查状态对象的 sb 属性(即接收到的字符串)。如果它包含"<EOF>"它,则通过EndInvoke在幕后调用来结束回调。只要 sb 不包含"<EOF>"回调就继续尝试读取。

于 2013-03-11T12:18:08.830 回答
2

您正在调用的方法定义为:

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginReceive(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)

您传递的 AsyncCallback(ReadCallback) 参数是一个指向方法的委托指针,发送方应在完成接收操作后调用该方法。

callback
Type: System.AsyncCallback
An AsyncCallback delegate that references the method to invoke when the operation is complete.

我认为套接字通信是单个通道中的一系列消息。

Readcallback 在特定消息数据的末尾“知道”它,因为正在调用该回调方法。即它被称为给定消息的所有数据的后传输。

如果您询问接收到的数据,并且它还包含根据您设计的协议的所有消息标记的结尾,即 EOF,那么您还应该关闭连接。

您还可以在状态对象中放置额外的上下文(并使用强制转换来键入它),您可以检查 // 在您的回调方法中引用。

因此,客户“知道”的内容归结为您的设计。这是使用原始套接字的好处之一。你设计了协议,你可以让它变得像你喜欢的那样简单或复杂。如果其他人确定了协议,那么您将获得相关文档或以其他方式询问他们。

在您的协议示例中,“EOF”表示文件/传输结束。如果您希望它是“香蕉”,那么它也可以很容易地成为“香蕉”,然后您会在消息中查找“香蕉”,如果找到它,您会关闭频道。

于 2013-03-11T12:21:40.493 回答
1

正如MSDN上所述,只要异步方法结束,就会调用这个特定的回调。
如果您不确定,您应该阅读文档(当然,如果可用,但 MSDN 提供了很多信息)。

于 2013-03-11T11:56:18.163 回答