Проблема связи по UDP при переключении с синхронизации на асинхронный - PullRequest
1 голос
/ 28 февраля 2011

У меня есть простое клиент-серверное приложение на 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 голосов
/ 28 февраля 2011

Я нашел свою проблему. Я не использовал правильную конечную точку на своем сервере для отправки ответа моему клиенту.

В моей функции callbackup получения теперь я использую mySender, который является SendPoint, определенным на уровне класса. Затем я использую это для отправки ответа моему клиенту.

newsock.EndReceiveFrom (ar, ref mySender);

newsock. BeginSendTo (отправка, 0, отправка. Длина, SocketFlags.None, mySender, новый AsyncCallback (OnSend), mySender);

Мое приложение теперь работает правильно.

0 голосов
/ 28 февраля 2011

Я не думаю, что состояние объекта может быть нулевым, попробуйте это:

newsock.BeginSendTo(sending, 0, sending.Length, SocketFlags.None, 
   remote1, new AsyncCallback(OnSend), newsock);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...