想要一个用于传入数据的.Net套接字事件处理程序

时间:2013-01-08 16:58:34

标签: c# .net sockets

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

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

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

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

1 个答案:

答案 0 :(得分:10)

你是服务员吗?

如果您是服务器,则将侦听套接字连接,然后接受套接字连接并存储它。然后,您将使用存储的套接字调用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与服务器类似。