java 获取udp地址,C#UDP套接字:获取接收者地址

我有一个异步UDP服务器类,其中一个套接字绑定在IPAddress.Any上,我想知道收到的数据包被发送到哪个IPAddress(...或收到) . 似乎我不能只使用Socket.LocalEndPoint属性,因为它总是返回0.0.0.0(这是有意义的,因为它绑定到...) .

以下是我目前使用的代码的有趣部分:

private Socket udpSock;

private byte[] buffer;

public void Starter(){

//Setup the socket and message buffer

udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

udpSock.Bind(new IPEndPoint(IPAddress.Any, 12345));

buffer = new byte[1024];

//Start listening for a new message.

EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);

udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);

}

private void DoReceiveFrom(IAsyncResult iar){

//Get the received message.

Socket recvSock = (Socket)iar.AsyncState;

EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0);

int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP);

byte[] localMsg = new byte[msgLen];

Array.Copy(buffer, localMsg, msgLen);

//Start listening for a new message.

EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);

udpSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, udpSock);

//Handle the received message

Console.WriteLine("Recieved {0} bytes from {1}:{2} to {3}:{4}",

msgLen,

((IPEndPoint)clientEP).Address,

((IPEndPoint)clientEP).Port,

((IPEndPoint)recvSock.LocalEndPoint).Address,

((IPEndPoint)recvSock.LocalEndPoint).Port);

//Do other, more interesting, things with the received message.

}

如前所述,这总是打印一条线,如:

从127.0.0.1:1678收到32个字节到0.0.0.0:12345

而且我希望它是这样的:

从127.0.0.1:1678到127.0.0.1:12345收到32个字节

在此先感谢您对此的任何想法! - 亚当

UPDATE

好吧,我找到了一个解决方案,虽然我不喜欢它...基本上,我没有打开绑定到IPAddress.Any的单个udp套接字,而是为每个可用的IPAddress创建一个唯一的套接字 . 所以,新的Starter功能如下所示:

public void Starter(){

buffer = new byte[1024];

//create a new socket and start listening on the loopback address.

Socket lSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

lSock.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);

EndPoint ncEP = new IPEndPoint(IPAddress.Any, 0);

lSock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ncEP, DoReceiveFrom, lSock);

//create a new socket and start listening on each IPAddress in the Dns host.

foreach(IPAddress addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList){

if(addr.AddressFamily != AddressFamily.InterNetwork) continue; //Skip all but IPv4 addresses.

Socket s = new Socket(addr.AddressFamily, SocketType.Dgram, ProtocolType.Udp);

s.Bind(new IPEndPoint(addr, 12345));

EndPoint newClientEP = new IPEndPoint(IPAddress.Any, 0);

s.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref newClientEP, DoReceiveFrom, s);

}

}

这只是为了说明这个概念,这个代码最大的问题就是每个套接字试图使用相同的缓冲区......这通常是一个坏主意......

必须有一个更好的解决方案;我的意思是,源和目标是UDP数据包头的一部分!哦,好吧,我想我会继续这样做,直到有更好的东西 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值