当发件人有多个网卡时,此功能sendto
选择随机ip发送数据包
那么获取sendto
使用的IP地址?
代码:
fd = socket(AF_INET, SOCK_DGRAM, 0);
sendto(fd, buf, len, 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
答案 0 :(得分:1)
它不会选择随机IP。它使用操作系统的路由表来确定哪个本地IP最有可能将数据路由到目标地址。但是,无法查询实际选择使用的IP sendto()
。您可以直接访问操作系统的路由表并尝试手动计算出来,但更好的选择是bind()
套接字到您希望sendto()
用作发送IP的特定IP,例如:
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));