Проблемы с асинхронным получением одноадресных пакетов UDP в Windows Phone 7 - PullRequest
8 голосов
/ 01 июля 2011

Я пытаюсь заставить мое приложение Windows Phone 7 Mango прослушивать входящие UDP-пакеты, но у меня очень много времени.У меня установлено новое бета-обновление 2 пакета SDK для Windows Phone 7.1 и средства разработки.Любое отклонение, которое я пробую из этого образца MSDN , приводит к SocketException 10022, «указан неверный аргумент».

Мой код вставлен ниже.Я пытался адаптировать код, который я нашел в этом сообщении stackoverflow , но безрезультатно.Эта строка генерирует исключение при достижении:

synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg);

Я надеюсь, что кто-то здесь может помочь определить, что происходит не так.Я вызываю «StartUnicastListen ()», когда пользователь нажимает кнопку.m_udpSock предварительно определен как переменная класса и имеет значение null.В разделе «Замечания» на странице MSDN ReceiveFromAsync () я установил все необходимые свойства и события.

private void StartUnicastListen()
{
    m_udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    SocketAsyncEventArgs udpRecvArg = new SocketAsyncEventArgs(); 
    udpRecvLoopStart(udpRecvArg);
}

private void udpRecvLoopStart(SocketAsyncEventArgs udpRecvArg) 
{ 
    byte[] udpRecvBuffer = new byte[2048];
    udpRecvArg.SetBuffer(udpRecvBuffer, 0, udpRecvBuffer.Length); 
    udpRecvArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any, 11100); 
    udpRecvArg.Completed += new EventHandler<SocketAsyncEventArgs>(udpRecvArg_Completed); 
    udpRecv(udpRecvArg); 
}    

private void udpRecv(SocketAsyncEventArgs udpRecvArg) 
{ 
     bool synchronous = false; 
     try {
         synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg);
     } catch (SocketException e) {
         Log("recvUdp()\n" + e.SocketErrorCode + "\n" + e.ToString(), false); 
         return; 
     } if (synchronous)
         udpRecvArg_Completed(this, udpRecvArg); 
}

void udpRecvArg_Completed(object sender, SocketAsyncEventArgs udpRecvArg) { 

     EndPoint udpEp = udpRecvArg.RemoteEndPoint; 
     string msg = Encoding.UTF8.GetString(udpRecvArg.Buffer, udpRecvArg.Offset, udpRecvArg.BytesTransferred); 
     Log(udpEp + " " + msg,false); 
     udpRecv(udpRecvArg); 
}

Существует такая ограниченная документация для правильного использования ReceiveFromAsync () - что кажетсябыть единственным вариантом для этого на WP7 - и на System.Net.Sockets в Windows Phone 7 в целом прямо сейчас.

Заранее благодарим за любую помощь, которую вы можете предоставить.

Ответы [ 4 ]

3 голосов
/ 11 июля 2011

У меня была такая же проблема, но вот решение, которое я придумала.Как сказал wilbur4321, сначала нужно что-то отправить в сокет.Кроме того, вам нужно не только просто позвонить SendToAsync и забыть об этом, вы должны подождать его (мне кажется, работает максимум 1 секунда).

Я не знаю, зачем вам это нужно, но отправка чего-либо (я просто отправляю 1 байт: 0xFF), кажется, делает свое дело.

1 голос
/ 10 июля 2011

Я обнаружил, что странная вещь в этом примере "Win7 UDP server" , то есть сокет UDP на стороне сервера, не "связывает"

в моем эксперименте,вызовите «ReceiveFromAsync» для сокета, который не связывается, исключение «неверный аргумент» - throw.После привязки перед «ReceiveFromAsync», по крайней мере, «ReceiveFromAsync» не будет выдавать исключение «недопустимый аргумент».

Мои коды похожи на ваши, но все еще есть проблемыкажется, что я вызываю «ReceiveFromAsync» один раз, но ОС запускает обратные вызовы событий дважды, что вызывает очень серьезное состояние гонки.

Примерных документов о "UDP + SocketAsyncEventArgs" очень мало.Может быть, я должен вернуться к использованию "BeginReceiveFrom".

1 голос
/ 02 июля 2011

Вы видели пример на http://msdn.microsoft.com/en-us/library/hh202864(v=VS.92).aspx#Y4537?

Учитывая, что TCP-сокеты в Mango доступны только для клиентов, мне интересно, UDP-сокеты могут работать только после того, как что-то было отправлено?Я бы предложил попробовать это.Если это не сработает, не могли бы вы опубликовать весь свой проект в Dropbox или чем-то подобном, и я посмотрю на него.

Спасибо, --randy

0 голосов
/ 21 сентября 2011

Вам необходимо вызвать ReceiveFormAsync () из события Completed функции SendTAsync (). В противном случае вы получите это исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...