从Sync切换到Async时出现UDP comm问题

时间:2011-02-28 14:03:13

标签: c# .net udp

我有一个简单的C#/。NET 3.5客户端/服务器应用程序我试图编写如何在UDP中进行通信。我能够使同步方法工作并来回发送数据,但现在我正在尝试切换到异步方法,并且我不断收到错误,“请求的地址在其上下文中无效。”

我的客户端代码如下:

    IPEndPoint ipep = new IPEndPoint(ipaddr, ipport);
    newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    EndPoint remote1 = (EndPoint)ipep;
    AddMessage("Looking for connections");
    byte[] strt = Encoding.ASCII.GetBytes("open");
    newsock.SendTo(strt,remote1);//.BeginSendTo(strt, 0, strt.Length, SocketFlags.None, remote1, new AsyncCallback(OnSend), null);
    IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint epSender = (EndPoint)ipeSender;
    newsock.ReceiveFrom(rcv, ref epSender);

我的服务器更复杂,因为我已经切换到异步通信。

在工作线程中,我打电话:

  try
  {
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint remote = (EndPoint)sender;
    AddMessage("Beginning Wait for connections");

    newsock.BeginReceiveFrom(rcv, 0, rcv.Length, SocketFlags.None, ref remote, new AsyncCallback(OnReceive), null);

    while (true)
    {
      if (pleasestop.WaitOne(20))
        break;
      ts = DateTime.Now - lastnoop;
      if (senddata)
      {
        //...fill sending byte array...

        IPEndPoint ipep = new IPEndPoint(IPAddress.Any,0);//ipaddr, ipport);
        EndPoint remote1 = (EndPoint)ipep;
        newsock.BeginSendTo(sending, 0, sending.Length, SocketFlags.None, remote1, new AsyncCallback(OnSend), null);
       }
    }

在我的OnSend回调函数中,我收到错误:“请求的地址在其上下文中无效。”

private void OnSend(IAsyncResult ar)
{
  try
  {
      newsock.EndSendTo(ar);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message + "\n" + ex.StackTrace, "Server Send Error");
  }
}

2 个答案:

答案 0 :(得分:0)

我不认为对象状态可以为null,请尝试:

newsock.BeginSendTo(sending, 0, sending.Length, SocketFlags.None, 
   remote1, new AsyncCallback(OnSend), newsock);

答案 1 :(得分:0)

我发现了我的问题。我没有在服务器中使用正确的EndPoint将响应发送回我的客户端。

在我的接收回调函数中,我现在使用mySender,它是在类级别定义的SendPoint。然后我用它将回复发送给我的客户。

newsock.EndReceiveFrom(ar,ref mySender);

newsock.BeginSendTo(发送,0,发送.Length,SocketFlags.None,mySender,新的AsyncCallback(OnSend),mySender);

我的应用现在正常运作。