2011-02-28 95 views
1

我有一個簡單的C#/ .NET 3.5客戶端/服務器應用程序我試圖編寫以獲取如何在UDP中進行通信的句柄。我能夠使同步方法工作並來回發送數據,但現在我試圖切換到異步方法,並且不斷收到錯誤消息,「請求的地址在其上下文中無效」。從同步切換到異步時的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); 

我的服務器是比較複雜的,因爲我已經切換到異步通信。

在工作線程我稱之爲:

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

在我OnSend回調函數是我得到的錯誤:「的請求的地址是無效的,在它的語境。」

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

我能夠通過傳遞給BeginSendTo遠程(在BeginReceiveFrom中使用上面)而不是定義新的EndPoint來解決錯誤。但是,我的客戶端仍然沒有從我的服務器的send語句接收數據。我怎麼知道服務器是否實際發送數據給客戶端?客戶端和服務器可以在同一臺機器上運行嗎? – PhilGyro 2011-02-28 14:33:33

回答

0

我不認爲對象的狀態可以爲空,試試這個:

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

我能夠通過傳遞給BeginSendTo(在BeginReceiveFrom中使用上述代碼)而不是定義新的EndPoint來解決錯誤。但是,我的客戶端仍然沒有從我的服務器的send語句接收數據,並且將null更改爲newsock似乎沒有任何區別。 – PhilGyro 2011-02-28 14:32:09

+0

MSDN(http://msdn.microsoft.com/en-us/library/wdfskwcy.aspx)表示,在調用ReceiveFrom之前,您必須使用Bind方法顯式地將Socket綁定到本地端點。 – SwDevMan81 2011-02-28 15:39:23

0

,我發現我的問題。我沒有在我的服務器中使用正確的EndPoint將響應發回給我的客戶端。

在我的接收回調函數中,我現在使用mySender,它是在類級別定義的SendPoint。然後我用這個來回應我的客戶。

newsock.EndReceiveFrom(ar,ref mySender); (發送,0,發送。長度,SocketFlags.None,mySender,新的AsyncCallback(OnSend),mySender);

我的應用程序現在正常工作。