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 を選択しません。OS のルーティング テーブルを使用して、データを宛先アドレスにルーティングする可能性が最も高いローカル IP を決定します。sendto()ただし、実際に使用することを選択した IP を照会する方法はありません。OS のルーティング テーブルに直接アクセスして手動で把握することもできますが、送信 IP として使用するbind()特定の 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 に答える