我正在用C#(.Net Framework 4.0)重写一个古老的VB6程序.它与工厂车间的一件工业设备进行通信.VB6使用了一些旧的基于COM的套接字软件; 我正在使用.Net Socket类.
当我向设备发送消息时,我希望得到回复,所以我知道要听一个.但是设备也可以在没有警告的情况下异步发送消息(例如,指示故障或问题).所以我总是要收到那些.所以我真正喜欢的是一个事件处理程序,只要有任何东西从设备进入就会被调用.
Socket类似乎使用BeginReceive/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工作类似于服务器.
| 归档时间: |
|
| 查看次数: |
16972 次 |
| 最近记录: |