15

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

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

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

在此先感谢您阐明执行此操作的正确方法。

4

1 回答 1

12

你是服务员吗?

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

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

这样,BeginReceiveandEndReceive就会循环运行:你总是在接收数据,并等待更多的数据。

这是一个例子

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工作类似于服务器。

于 2013-01-08T17:52:17.883 回答