2011-02-28 5 views
1

UDP로 통신하는 방법을 처리하기 위해 작성하려고하는 간단한 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); 

내 서버는 더 복잡 다음과 같이

내 클라이언트 코드입니다. 작업자 스레드에서

내가 전화 : 나는 오류가 어디에 내 OnSend 콜백 함수에서
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); 
     } 
    } 

는 "이 문맥의에서 요청한 주소가 유효하지 않습니다." 내가 객체 상태가 null이 될 수 있다고 생각하지 말아

private void OnSend(IAsyncResult ar) 
{ 
    try 
    { 
     newsock.EndSendTo(ar); 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message + "\n" + ex.StackTrace, "Server Send Error"); 
    } 
} 
+0

새로운 EndPoint를 정의하는 대신 BeginSendTo remote (BeginReceiveFrom에서 위에 사용됨)에 전달하여 오류를 해결할 수있었습니다. 그러나 클라이언트가 내 서버의 send 문에서 데이터를받지 못하고 있습니다. 서버가 실제로 클라이언트에 데이터를 보내고 있는지 어떻게 알 수 있습니까? 클라이언트와 서버를 같은 컴퓨터에서 실행할 수 있습니까? – PhilGyro

답변

0

,이 시도 :

newsock.BeginSendTo(sending, 0, sending.Length, SocketFlags.None, 
    remote1, new AsyncCallback(OnSend), newsock); 
+0

새로운 EndPoint를 정의하는 대신 BeginSendTo remote (BeginReceiveFrom에서 위에 사용됨)에 전달하여 오류를 해결할 수있었습니다. 그러나 클라이언트가 내 서버의 send 문에서 데이터를받지 못하고 null을 newsock으로 변경해도 차이가없는 것 같습니다. – PhilGyro

+0

MSDN (http://msdn.microsoft.com/en-us/library/wdfskwcy.aspx)에서는 ReceiveFrom을 호출하기 전에 Bind 메서드를 사용하여 소켓을 로컬 끝점에 명시 적으로 바인딩해야한다고 말합니다. – SwDevMan81

0

나는 내 문제를 발견했다. 내 서버에 올바른 EndPoint를 사용하지 않아 클라이언트에게 응답을 보냈습니다.

내 수신 콜백 기능에서 이제 클래스 수준에서 정의 된 SendPoint 인 mySender를 사용합니다. 그런 다음이 정보를 사용하여 내 고객에게 응답을 보냅니다.

newsock.EndReceiveFrom (ar, ref mySender);

newsock.BeginSendTo (보내는 중, 0, 보내는 중. 길이, SocketFlags.None, mySender, 새 AsyncCallback (OnSend), mySender);

내 앱이 올바르게 작동하고 있습니다.

관련 문제