【问题标题】:Want a .Net Socket Event Handler for incoming data想要一个用于传入数据的 .Net 套接字事件处理程序
【发布时间】:2012-12-22 14:41:30
【问题描述】:

我正在用 C# (.Net Framework 4.0) 重写一个古老的 VB6 程序。它与工厂车间的一台工业设备进行通信。 VB6 使用了一些旧的基于 COM 的套接字软件;我正在使用 .Net Socket 类。

当我向设备发送消息时,我希望得到回复,所以我知道要听一个。但是设备也可以在没有警告的情况下异步发送消息(例如,指示故障或问题)。所以我总是必须收到这些。所以我真正想要的是一个事件处理程序,只要有任何东西从设备进来,它就会被调用。

Socket 类似乎使用 BeginReceive/EndReceive 方案来处理接收事件。我可以在程序开始时执行一次 BeginReceive 来为所有传入消息定义事件处理程序,还是必须在整个程序中不断执行 BeginReceive/EndReceive?

提前感谢您澄清正确的方法。

【问题讨论】:

  • 我还没有尝试过任何事情,因为我试图了解 Socket 类打算如何处理此类事件。除非我误读了它,否则 MSDN 会让您看起来每次都应该重新调用 BeginReceive,而我正在寻找一个我声明一次的事件处理程序,只要我在连接的。 Socket类有这样的东西吗?
  • 不知道为什么这被否决了:写得很好,提供的答案不仅解决了这个问题,而且解决了我即将发布的问题。

标签: c# .net sockets


【解决方案1】:

你是服务器吗?

如果你是服务器,你会监听一个socket连接,然后接受这个socket连接并存储。然后,您将使用存储的套接字调用 BeginReceive。在BeginReceive方法中,你会提供一个回调函数来接收、处理数据。

一旦您收到数据,就会发生回调。回调函数将在存储的连接上调用EndReceive。这是您获取/处理数据的地方。您还将再次致电BeginReceive 以等待更多数据。

这样,BeginReceiveEndReceive 会绕一个圈:你一直在接收数据,等待更多数据。

Here is an example

void WaitForData(SocketState state)
{
  try
  {
    state.Socket.BeginReceive(state.DataBuffer, 0, state.DataBuffer.Length, SocketFlags.None, new AsyncCallback(ReadDataCallback), state);
  }
  catch (SocketException se)
  {
    //Socket has been closed  
    //Close/dispose of socket
  }
}

public void ReadDataCallback(IAsyncResult ar)
{
  SocketState state = (SocketState)ar.AsyncState;
  try
  {
    // Read data from the client socket.
    int iRx = state.Socket.EndReceive(ar);

    //Handle Data....
    WaitForData(state);
  }
  catch (ObjectDisposedException)
  {
    //Socket has been closed  
    //Close/dispose of socket
  }
  catch (SocketException)
  {
    //Socket exception
    //Close/dispose of socket
  }
}

编辑: 根据您的评论,以下是 C# 异步客户端的示例:http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx

BeginReceive/EndReceive 的工作方式类似于服务器。

【讨论】:

  • BeginReceive 是否也在回调函数内部调用?调用 EndReceive 的目的是什么?回调函数不是可重入的吗?如果我调用 EndReceive 然后做一些事情然后再次调用 BeginReceive 在我做这些事情时会发生什么?
  • 是的,回调函数中调用了BeginReceive。 EndRecieve 将从接收中获取数据。在您的回调中:您调用 EndReceive,然后处理数据,然后调用 BeginReceive。
  • re “你是服务器吗?” PC发起连接,设备只是监听一个,虽然PC和工厂设备都可以发起数据传输,而无需对方提示。所以我认为这使 PC 成为客户端。
  • 我添加了一个简单的 beginReceive/EndReceive 示例
  • 我正在解释的 C# 代码和链接的示例用于异步套接字。您必须使用 BeginReceive/EndReceive 异步执行套接字操作。如果您不想使用异步套接字,则可以使用同步套接字:msdn.microsoft.com/en-ca/library/kb5kfec7.aspx.
猜你喜欢
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 2012-07-02
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多