1

いくつかの異なる IP アドレスを持つサーバーがあります。この時点で、各 IP は UDP 要求を受信できますが、応答するのは常に同じ IP であり、要求者はこれを好みません。

簡単に言うと、これがすべての重要なコードです。

int sock;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
memset((char*)&serv_addr, 0, sizeof(serv_addr));

sock = socket(AF_INET, SOCK_DGRAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
...
recvfrom(sock, buffer, BUFLEN, 0, (struct sockaddr *)&cli_addr, &clilen);
...
sendto(sock, resData, resLen, 0, (struct sockaddr *)&cli_addr, sizeof(cli_addr));

どの IP を使用してパケットを送り返すかを何らかの方法で指定できるようにしたいと考えています (これは、リクエストごとに異なる可能性があります) が、ソケットを使用してこれを達成する方法と方法がわかりません。私はこの分野での経験があまりないので、私が得ることができるすべての助けは大歓迎です.

以下を編集

ここで受け入れられた回答で潜在的な解決策を見つけました: Linuxでudpソケットを再バインドする方法

ただし、新たな問題が発生します。どの IP/インターフェースがリクエストを受信したかを知るにはどうすればよいですか? そのIP /インターフェースを使用して応答できるようにします。

4

3 に答える 3

1

bind()使用するインターフェイスの IP であるローカル IP アドレスを取得する必要があります。

についてこのガイドを読むbind()

Beej のネットワーキング ガイド#bind

于 2013-10-08T12:53:33.693 に答える
0

典型的な TCP/UDP ソケットは、Rx/Tx を実行する前に特定の IP/ポートにバインドします。アプローチに raw ソケットを使用してみてください。

かなり大きなコードです。次のリンクを参照して ください http://sock-raw.org/papers/sock_raw

raw ソケットを作成する - raw ソケット経由の Rx - これで、raw ソケット経由で L2 Tx からフレーム全体を受信します - 関連するフィールドを変更した後、L3 ヘッダーから送信します

于 2013-10-08T09:21:45.993 に答える