Windows下如何设置UDP源地址
Howto set the UDP source address on Windows
似乎没有可移植的方法来设置从绑定到INADDR_ANY的套接字发送UDP数据报的源IP,但至少在Linux和FreeBSD上可以使用sendmsg()
和IP_PKTINFO
(Linux)或IP_SENDSRCADDR
(FreeBSD)选项来完成。(参见这个问题)
是否有一个等效的选项来设置UDP源IP在Windows上?
From MSDN:
<WSASendMsg函数/strong>
[…]
在
SOCK_DGRAM
或SOCK_RAW
类型的IPv4套接字上,应用程序可以使用WSASendMsg
函数指定发送使用的本地IP源地址。在WSAMSG
结构中传递给WSASendMsg
函数的控制数据对象之一可能包含in_pktinfo
结构,用于指定用于发送的本地IPv4源地址。
同样适用于in6_pktinfo
结构的IPv6套接字。
对于双模套接字,重要的是IPv4源地址不能在in6_pktinfo
中指定为IPv4映射的IPv6地址,而是在in_pktinfo
结构中指定为IPv4地址。
例子:
union {
char in[WSA_CMSG_SPACE(sizeof(struct in_pktinfo))];
char in6[WSA_CMSG_SPACE(sizeof(struct in6_pktinfo))];
} cdata;
WSAMSG msg;
memset(&msg, 0, sizeof(msg));
msg.name = &remote_sysaddr.addr.generic;
msg.namelen = remote_sysaddr.len;
msg.lpBuffers = &buf;
msg.dwBufferCount = 1;
msg.Control.buf = (char *)&cdata;
msg.Control.len = sizeof(cdata);
int sum = 0;
WSACMSGHDR *cmsg = WSA_CMSG_FIRSTHDR(&msg);
...
memset(cmsg, 0, WSA_CMSG_SPACE(sizeof(struct in_pktinfo)));
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_PKTINFO;
cmsg->cmsg_len = WSA_CMSG_LEN(sizeof(struct in_pktinfo));
struct in_pktinfo *pktinfo = (struct in_pktinfo *)WSA_CMSG_DATA(cmsg);
pktinfo->ipi_addr.s_addr = local_addr->ipv4;
sum += WSA_CMSG_SPACE(sizeof(struct in_pktinfo));
...
msg.Control.len = sum;
if (bs->WSASendMsg(bs->socket, &msg, 0, &bytes, NULL, NULL) != 0) {
...
我想就是这样了。
UdpClient Constructor (IPEndPoint)
这个构造函数创建一个新的UdpClient并将其绑定到由localEP参数指定的IPEndPoint。在调用此构造函数之前,必须使用打算从中发送和接收数据的IP地址和端口号创建一个IPEndPoint。发送和接收数据时不需要指定本地IP地址和端口号。如果不这样做,底层服务提供者将分配最合适的本地IP地址和端口号。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 从udp接收帧对于人脸识别来说太慢
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 为什么 Windows udp 接收套接字上的超时总是比 SO_RCVTIMEO 设置的长 500 毫秒
- sdl_net UDP 服务器设置
- POCO库:可以设置UDP源端口
- 将 UDP 数据包从 WAN 发送到本地计算机,而无需在路由器C++上设置端口转发
- 我如何设置一个不断侦听循环与接收udp套接字,而不使它成为一个服务器
- 提升 Asio UDP 服务器设置套接字以侦听指定的 IP
- Windows下如何设置UDP源地址
- 正在设置传出UDP数据包的TTL
- 用于 LAN 计算机发现和服务器设置的 UDP 广播