0

当发送方有多个网卡时,该函数sendto选择随机ip发送数据包。
那么获取使用的IP地址sendto
代码:

fd = socket(AF_INET, SOCK_DGRAM, 0);
sendto(fd, buf, len, 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
4

1 回答 1

2

它不会选择随机 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));
于 2013-04-24T02:26:01.147 回答