2

私は現在、これを行うだけで、私が書いた単純なブロードキャストサーバー(「こんにちは」をブロードキャストするだけ)を聞くことができます:

int fd = socket(PF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
add.sin_family = AF_INET;
add.sin_port = htons(10074);
bind(fd, struct sockaddr*) &addr, sizeof(addr));

char buf[800];
recvfrom(fd, buf, sizeof(buf), 0, NULL, 0);

私が疑問に思っているのは、上記はどのインターフェースを使用しているのでしょうか? ある種のデフォルト?また、ブロードキャストをリッスンするインターフェイスを変更するにはどうすればよいですか? 設定によるマルチキャストimr_addressと構造体imr_ifindexで見たことip_mreqnがありますが、ブロードキャストに相当するものがあるかどうかはわかりません。

4

2 に答える 2

2

インターフェイス名で識別される特定のインターフェイスでリッスンする場合は、 を使用getifaddrsしてインターフェイス名をソケット アドレスのセットにマップし、ソケットをそのような各アドレスにバインドします。(一般に、アドレスごとに複数のソケットをバインドする必要がある場合があります。インターフェイスは多くのアドレスを持つことができます。)

ただし、一般的にはアドレスでリスナーを構成する方が適切であり、どのアドレスがどのインターフェースに対応するかをカーネルに任せます。この方法は、他の IP ベースのサービスと一致しており、システム管理者はそれに慣れています。

于 2013-11-20T16:12:13.657 に答える
2

リッスンするポートを変更する場合は、特定のアドレスを選択するだけです (現在、明示的に割り当てるのではなく、sin_addr0 のままにしています)。アドレスは IP アドレスの 1 つである必要があり、インターフェイスはそこから自動的に選択されます。memsetINADDR_ANY

于 2013-11-20T16:07:41.760 に答える