2011-07-01 4 views
8

내 Windows Phone 7 Mango 앱에서 들어오는 UDP 패킷을 청취하려고하지만 시간이 지났습니다. Windows Phone 7.1 SDK와 개발자 도구가 새로이 베타 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()의 적절한 사용에있다 - 지금 일반적으로 윈도우 폰 7과 System.Net.Sockets에 - 유일한 WP7에 이것에 대한 옵션을 것 같다.

제공 할 수있는 도움에 미리 감사드립니다.

+0

나는 비슷한 문제가 있습니다 ... 그렇지 않으면, 당신은이 예외를 얻을 것이다 .. SendTAsync()의 완료 이벤트에서() ReceiveFormAsync를 호출해야합니다. 어떤 이유로 나는 ReceiveFromAsync에 대한 예외도 얻는다. –

+0

여기에도 같은 문제가 있습니다. – IDWMaster

+0

같은 문제가 있습니다. | – Antimony

답변

1

http://msdn.microsoft.com/en-us/library/hh202864(v=VS.92).aspx#Y4537에서 샘플을 보았습니까?

망고에서 TCP 소켓이 클라이언트 전용이라는 것을 감안할 때, 뭔가가 전송 된 후에 UDP 소켓이 작동 할 수 있을지 궁금합니다. 나는 그것을 시도하는 것이 좋습니다. 그래도 작동하지 않는다면 전체 프로젝트를 보관 용 계정 등에 게시 할 수 있습니까?

감사합니다, --randy

1

내가 발견이 "Win7에 UDP 서버"샘플에서 이상한 것은 서버 측 UDP 소켓입니다

하지 "바인딩"수행 내 실험에서 "ReceiveFromAsync"를 바인딩하지 않는 소켓에서 호출합니다. "잘못된 인수"예외가 발생합니다. "ReceiveFromAsync"전에 바인딩 한 후 적어도 "ReceiveFromAsync"는 "잘못된 인수"예외를 throw하지 않습니다.

내 코드는 사용자의 코드와 유사하지만 여전히 몇 가지 문제가 있습니다. 그것은 "ReceiveFromAsync"를 한 번 호출하지만 OS는 이벤트 콜백을 두 번 실행하므로 매우 심각한 경쟁 조건이 발생할 수 있습니다.

"UDP + SocketAsyncEventArgs"에 대한 샘플이 거의 없습니다. 어쩌면 다시 "BeginReceiveFrom"을 사용하여 되돌려 야합니다.

3

나는이 같은 문제가 있었지만, 여기에 나와있는 해결책이 있습니다. wilbur4321이 말했듯이, 먼저 소켓에 무엇인가를 보내야합니다. 또한, SendToAsync를 호출하고 잊어 버릴 필요가 없을뿐만 아니라, 기다려야합니다 (최대 1 초가 나를 위해 작동하는 것 같습니다).

왜 이렇게해야하는지 모르겠지만 뭔가를 보내면 (그냥 1 바이트 : 0xFF 보내기) 트릭을 수행하는 것 같습니다.

+0

이것은 ReceiveFromAsync 호출을 허용합니다. 문제는, 내가 보내는 모든 엔드 포인트에서 패킷을 수신하는 것처럼 보일 수 있다는 것입니다. 브로드 캐스트 패킷을받을 수 없습니다. –

0

당신은

관련 문제