当发送方有多个网卡时,该函数sendto
选择随机ip发送数据包。
那么获取使用的IP地址sendto
?
代码:
fd = socket(AF_INET, SOCK_DGRAM, 0);
sendto(fd, buf, len, 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
它不会选择随机 IP。它使用操作系统的路由表来决定哪个本地 IP 最有可能将数据路由到目标地址。但是,无法查询sendto()
实际选择使用哪个 IP。您可以直接访问操作系统的路由表并尝试手动找出它,但更好的选择是仅将套接字连接到您要用作发送 IPbind()
的特定 IP ,例如:sendto()
fd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in localaddr;
memset(&localaddr, 0, sizeof(addr));
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = inet_addr("192.168.0.1"); // the desired local IP
bind(fd, (struct sockaddr*)&localaddr, sizeof(localaddr));
sendto(fd, buf, len, 0, (struct sockaddr*)&servaddr, sizeof(servaddr));