我有一个嵌入式以太网接口(Lantronix XPort),可以响应UDP广播及其识别信息。
我能够多播“魔术数据包”,并且数据报被侦听器正确接收,但是我还需要找出哪个IP地址发送该响应数据报。如果它是TCP,我会执行socket.RemoteEndPoint,但是当应用于UDP套接字时会引发异常。
public class Program
{
public static void Main(string[] args)
{
// magic packet
byte[] magicPacket = new byte[4] { 0, 0, 0, 0xf6 };
// set up listener for response
Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// EDIT: Also, had to add this to for it to broadcast correctly
sendSocket.EnableBroadcast = true;
IPEndPoint listen_ep = new IPEndPoint(IPAddress.Any, 0);
sendSocket.Bind(listen_ep);
// set up broadcast message
EndPoint send_ep = new IPEndPoint(IPAddress.Parse("192.168.255.255"), 30718);
sendSocket.SendTo(magicPacket, magicPacket.Length, SocketFlags.None, send_ep);
DateTime dtStart = DateTime.Now;
while (true)
{
if (sendSocket.Available > 0)
{
byte[] data = new byte[2048];
// throws SocketException
//IPEndPoint ip = sendSocket.RemoteEndPoint as IPEndPoint;
sendSocket.Receive(data, SocketFlags.None);
if (data.Length > 4)
{
PrintDevice(data);
}
}
if (DateTime.Now > dtStart.AddSeconds(5))
{
break;
}
Console.WriteLine(".");
Thread.Sleep(100);
}
// wait for keypress to quit
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
有什么想法?是否有更好的策略来阅读响应数据报,以便我确定远程IP地址?
编辑:
通常情况下,我在SO上发布的那一刻,片刻的清晰度就会打动我。
原来我可以这样做:
EndPoint remote_ep = new IPEndPoint(IPAddress.Any, 0);
// Use ReceiveFrom instead of Receieve
//sendSocket.Receive(data, SocketFlags.None);
sendSocket.ReceiveFrom(data, ref remote_ep);
而remote_ep现在包含远程端点信息!
答案 0 :(得分:8)
看一下ReceiveFrom而不是Receive,它会让你传递对端点的引用。
答案 1 :(得分:0)
EndPoint remote_ep = new IPEndPoint(IPAddress.Any,0); //使用ReceiveFrom而不是
sendSocket.Receive(data,SocketFlags.None);
sendSocket.ReceiveFrom(data,ref remote_ep);
我认为它适用于IP,但端口号失败 如果您注意到
尝试将0转换为6530 4expl
等其他内容系统将生成它的随机端口号
为什么会有任何想法?
P.S。任何想法如何在这里改变我的用户名....?
发现IT:抽象类仅用于表示端口的值,而不是
因为事先没有绑定这个操作,所以引用EndPoint代表发送者。这意味着它显示发件人端口和IP不指定从哪里获得通信。并且EndPoint实例化实际上只是一种形式,似乎它被系统覆盖,无论如何都有发件人地址。我认为它必须与UDP协议的工作方式有所不同。 但总的来说,最终的结果是只显示你从哪里获得数据包,而且只是它没有指明你想要从哪里来的commuicatino。
答案 2 :(得分:0)
异步套接字怎么样?我没有找到任何方法来获取远程IP地址。 (异步方法ReceiveFromAsync
是我在wp8中唯一的选择)