2011-07-01 13 views
8

Próbuję pobrać aplikację Windows Phone 7 Mango do odsłuchiwania przychodzących pakietów UDP, ale z dużą szybkością. Mam nowe odświeżenie Beta 2 zestawu Windows Phone 7.1 SDK i narzędzi programistycznych. Wszelkie odchylenia, które wypróbowuję od tego MSDN sample, powodują SocketException 10022, "Podano niepoprawny argument".Problemy z asynchronicznym odbiorem pakietów UDP Unicast w systemie Windows Phone 7

Mój kod został wklejony poniżej. Próbowałem dostosować kod, który znalazłem na this stackoverflow post, ale bezskutecznie. Linia ta generuje wyjątek po jej osiągnięciu:

synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg); 

Mam nadzieję, że ktoś tutaj pomoże ustalić, co się dzieje. Nazywam "StartUnicastListen()", gdy użytkownik naciśnie przycisk. m_udpSock jest wcześniej zdefiniowany jako zmienna klasy i ustawiony na null. W sekcji "Uwagi" strony MSN ReceiveFromAsync() ustawiłem wszystkie wymagane właściwości i zdarzenia.

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); 
} 

Jest taka ograniczona dokumentacja właściwe wykorzystanie ReceiveFromAsync() - co wydaje się być jedyną opcją dla tego na WP7 - i na System.Net.Sockets w Windows Phone 7 w ogóle teraz.

Z góry dziękujemy za wszelką pomoc, jaką możesz zapewnić.

+0

Mam podobny problem. Z jakiegoś powodu otrzymuję wyjątek również w ReceiveFromAsync. –

+0

Ten sam problem również tutaj. – IDWMaster

+0

Ten sam problem tutaj: | – Antimony

Odpowiedz

1

Czy widziałeś próbkę pod numerem http://msdn.microsoft.com/en-us/library/hh202864(v=VS.92).aspx#Y4537?

Biorąc pod uwagę, że gniazda TCP są tylko klientami w Mango, zastanawiam się, czy gniazda UDP mogą działać dopiero po wysłaniu czegoś? Proponuję spróbować. Jeśli to nie zadziała, czy możesz opublikować cały projekt w Dropbox lub tym podobne, a ja na to popatrzę.

Dzięki, --randy

1

stwierdziliśmy, że coś dziwnego w tym "Serwer Win7 UDP" próbki że jest gniazdo UDP po stronie serwera nie "Bind"

w moim eksperymencie wywołaj "ReceiveFromAsync" na gnieździe, które nie wiąże, wyjątek "nieprawidłowy argument" to rzut. Po powiązaniu przed "ReceiveFromAsync", przynajmniej "ReceiveFromAsync" nie wyrzuci wyjątku "invalid argument".

Moje kody są podobne do Twoich, ale nadal występują pewne problemy. wygląda na to, że raz nazywam "ReceiveFromAsync", ale system operacyjny uruchamia dwa razy wywołania zwrotne zdarzeń, które powodują bardzo poważny stan wyścigu.

Jest tak mało przykładów dokumentów dotyczących "UDP + SocketAsyncEventArgs". Może muszę wrócić do używania "BeginReceiveFrom".

3

Miałem ten sam problem, ale tutaj jest rozwiązanie, które wymyśliłem. Jak powiedział wilbur4321, musisz najpierw wysłać coś do gniazda. Poza tym musisz nie tylko zadzwonić do SendToAsync i zapomnieć o tym, musisz na to czekać (maksymalnie 1 sekunda wydaje się działać dla mnie).

Nie wiem, dlaczego jest się do tego zobowiązanym, ale wysłanie czegoś (właśnie wysłałem 1 bajt: 0xFF) wydaje się działać.

+0

Umożliwia to wywoływanie funkcji ReceiveFromAsync. Problem polega na tym, że mogę tylko wydawać się otrzymywać pakiety z dowolnego punktu końcowego, który wysyłam. Nie mogę odbierać pakietów emisji. –

0

Trzeba zadzwonić ReceiveFormAsync() z wypełnionego przypadku SendTAsync() .. W przeciwnym razie dostaniesz ten wyjątek ..

Powiązane problemy