2011-07-01 10 views
8

Windows Phone 7 Mangoアプリケーションを受信UDPパケットで待機させようとしていますが、時間があります。 Windows Phone 7.1 SDKと開発ツールがインストールされた新しいBeta 2を更新しました。私がこのMSDN sampleから試してみると、SocketException 10022、 "無効な引数が提供されました"という結果になります。Windows Phone 7で非同期UDPユニキャストパケットを受信する際の問題

以下に自分のコードを貼り付けます。私はthis stackoverflow postで見つけたコードを適応させようとしてきたが、役に立たなかった。この行は、到達したときに例外を生成します。

synchronous = m_udpSock.ReceiveFromAsync(udpRecvArg); 

私は、ここにいる誰かが何がうまくいかないのかを確認することを望んでいます。ユーザーがボタンを押すと "StartUnicastListen()"が呼び出されます。 m_udpSockは以前にクラス変数として定義され、nullに設定されています。 ReceiveFromAsync()MSDNページの「Remarks」セクションに、必要なプロパティとイベントをすべて設定しました。

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()の適切な使用方法があります - 今、一般的にのWindows Phone 7でとSystem.Net.Socketsに - だけWP7で、このためのオプションをあるように思われます。

お手数ですがお寄せいただきありがとうございます。

+0

...そうでなければ、あなたはこの例外が発生します。)(SendTAsyncのCompletedイベントからReceiveFormAsync()を呼び出す必要があります。私は何らかの理由でReceiveFromAsyncも例外になります。 –

+0

同じ問題も同じです。 – IDWMaster

+0

同じ問題があります:| – Antimony

答えて

1

http://msdn.microsoft.com/en-us/library/hh202864(v=VS.92).aspx#Y4537でサンプルを見たことがありますか?

TCPソケットがマンゴーでクライアント専用であるとすれば、何かが送信された後にのみUDPソケットが機能するのだろうか?私はそれを試みることをお勧めします。それでも問題が解決しない場合は、プロジェクト全体をDropboxなどに投稿できますか?それを見ていきます。

おかげで、 --randy

1

は、私が発見したという "Win7のUDPサーバー" のサンプルで奇妙なことサーバー側のUDPソケットである

ない "バインド" を行います私の実験では、バインドしていないソケットで "ReceiveFromAsync"を呼び出すと、 "無効な引数"の例外がスローされます。 "ReceiveFromAsync"の前にバインドした後、少なくとも "ReceiveFromAsync"は "無効な引数"の例外をスローしません。

私のコードはあなたのものと似ていますが、まだいくつかの問題があります。私は "ReceiveFromAsync"を一度呼び出しているようですが、OSはイベントコールバックを2回起動します。これは非常に重大な競合状態を引き起こします。

"UDP + SocketAsyncEventArgs"に関するサンプル、ドキュメントはごくわずかです。たぶん私は "BeginReceiveFrom"を使用することに戻る必要があります。

3

私はこの同じ問題を抱えていましたが、ここで私が思いついた解決策があります。 wilbur4321が言ったように、最初にソケットに何かを送る必要があります。また、SendToAsyncを呼び出すだけでなく、それを忘れる必要があるだけでなく、それを待たなければなりません(最大1秒は私のために働くようです)。

なぜあなたはこれを行う必要があるのか​​わかりませんが、何かを送信する(私はちょうど1バイト:0xFFを送信します)、そのトリックを行うようです。

+0

これはReceiveFromAsyncの呼び出しを許可します。問題は、私が送るエンドポイントからのパケットしか受信できないように見えることです。ブロードキャストパケットを受信できません。 –

0

あなたは、私は同様の問題を抱えてい

関連する問題