我正在用 C# (.Net Framework 4.0) 重写一个古老的 VB6 程序。它与工厂车间的一台工业设备进行通信。 VB6 使用了一些旧的基于 COM 的套接字软件;我正在使用 .Net Socket 类。
当我向设备发送一条消息时,我希望收到回复,这样我就知道要收听了。但是设备也可以在没有警告的情况下异步发送消息(例如,指示故障或问题)。所以我总是必须收到那些。所以我真正想要的是一个事件处理程序,只要设备有任何消息,它就会被调用。
Socket 类似乎使用 BeginReceive/EndReceive 方案来处理接收事件。我可以只在程序开始时执行一次 BeginReceive 来为所有传入消息定义事件处理程序,还是必须在整个程序中不断执行 BeginReceive/EndReceive?
预先感谢您阐明执行此操作的正确方法。
最佳答案
你是服务员吗?
如果你是服务器,你会监听一个套接字连接,然后接受这个套接字连接并存储起来。然后,您将使用存储的套接字调用 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
}
}
编辑: 根据您的评论,这里有一个 C# 异步客户端的示例:http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx .
BeginReceive
/EndReceive
的工作方式类似于服务器。
关于c# - 想要一个用于传入数据的 .Net 套接字事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220173/