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

标签 c# .net sockets

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

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

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

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

最佳答案

你是服务员吗?

如果你是服务器,你会监听一个套接字连接,然后接受这个套接字连接并存储起来。然后,您将使用存储的套接字调用 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 的工作方式类似于服务器。

关于c# - 想要一个用于传入数据的 .Net 套接字事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220173/

相关文章:

android - 将 .NET dll 移植到不同的平台

MySql:身份验证方法 'caching_sha2_password' 失败

javascript - Socket.io 按钮监听器无法在移动设备上工作

java - 不在同一 IP 范围内时无法连接 Socket。 (子网)

c# - 当ButtonPressEvent发生时获取鼠标坐标

c# - Windows 8 应用程序中的 GridView SelectionMode 最多有 2 个选择

c# - WPF绑定(bind)不工作

c# - WIX调试版本 "insufficient privileges to start service"

javascript - 使用 socket.io 跟踪连接的套接字

c# - 为什么 Type.GetElementType 返回 null?