我有一个简单的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);
我的服务器更复杂,因为我已经切换到异步通信。
在工作线程中,我打电话:
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 :(得分:0)
我不认为对象状态可以为null,请尝试:
newsock.BeginSendTo(sending, 0, sending.Length, SocketFlags.None,
remote1, new AsyncCallback(OnSend), newsock);
答案 1 :(得分:0)
我发现了我的问题。我没有在服务器中使用正确的EndPoint将响应发送回我的客户端。
在我的接收回调函数中,我现在使用mySender,它是在类级别定义的SendPoint。然后我用它将回复发送给我的客户。
newsock.EndReceiveFrom(ar,ref mySender);
newsock.BeginSendTo(发送,0,发送.Length,SocketFlags.None,mySender,新的AsyncCallback(OnSend),mySender);
我的应用现在正常运作。