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

use*_*117 11 .net c# sockets

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

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

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

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

Mau*_*imo 10

你是服务员吗?

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

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

这样,BeginReceive并且EndReceive将以圆形运行:您始终在接收数据,并等待更多数据.

这是一个例子:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

BeginReceive/ EndReceive工作类似于服务器.