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