我正在用C#(.Net Framework 4.0)重写一个古老的VB6程序。它与工厂车间的一件工业设备进行通信。 VB6使用了一些旧的基于COM的套接字软件;我正在使用.Net Socket类。
当我向设备发送消息时,我希望得到回复,所以我知道要听一个。但设备也可以在没有警告的情况下发送消息异步(例如,表示故障或问题)。所以我总是必须接收这些。所以我真正喜欢的是一个事件处理程序,只要有任何东西从设备进入就会被调用。
Socket类似乎使用BeginReceive / EndReceive方案进行接收事件处理。我可以在程序开始时执行一次BeginReceive来为所有传入消息定义事件处理程序,还是我必须在整个程序中不断地执行BeginReceive / EndReceive?
提前感谢您澄清正确的方法。
答案 0 :(得分: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
}
}
编辑: 根据您的评论,这是一个C#异步客户端的示例:http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx。
BeginReceive
/ EndReceive
与服务器类似。