|
|
1
3
您可以枚举所有网络适配器,获取它们的IP地址,并将子网掩码覆盖的部分与发送方的地址进行比较。 比如:
|
|
|
2
3
|
|
|
3
3
你好, 我假设您已经使用INADDR_ANY指定了地址进行了绑定。 如果是这样的话,那么INADDR_ANY的语义是在所有接口上指定的端口上创建UDP套接字。套接字将接收发送到指定端口上所有接口的所有数据包。 使用此套接字发送时,将使用编号最低的接口。传出发送者的地址字段设置为所使用的第一个传出接口的IP地址。 第一个输出接口定义为执行ifconfig-a时的序列。它可能是eth0。 HTH。 干杯, 抢 |
|
|
4
0
遗憾的是,当与绑定到“AnyIP”的套接字一起使用时,sendto和recvfrom API调用从根本上被破坏,因为它们没有本地IP信息的字段。 那么,你能做些什么呢?
这些选择都不好。猜测很明显总是会产生错误的答案。如果程序运行时本地地址列表发生变化,绑定单独的套接字会增加软件的复杂性并导致问题。较新的API是正确的技术解决方案,但可能会降低可移植性
Edit看起来我错了,似乎MS文档具有误导性,WSArecvmsg在windows XP上可用。看见 https://stackoverflow.com/a/37334943/5083516 |
|
|
5
-3
在Linux环境中,您可以使用 recvmsg 获取本地ip地址。
以下内容在非对称路由环境中不起作用。 您可以首先将SO_REUSEADDR设置为true
之后
|
|
|
6
-3
ssize_t
recvfrom(int socket, void *restrict buffer, size_t length, int flags,
struct sockaddr *restrict address, socklen_t *restrict address_len);
ssize_t
recvmsg(int socket, struct msghdr *message, int flags);
[..]
If address is not a null pointer and the socket is not connection-oriented, the
source address of the message is filled in.
实际代码:
fprintf(stdout,“在本地地址%s\n上读取%d个字节”,nbytes,inet_ntoa(bindaddr.sin_addr.s_addr)); 希望这能有所帮助。 |