2010-11-24 13 views
0

Ich habe 3 Netzwerkschnittstellen auf meinem Rechner (eth0-2) jeder hat sein eigenes Netzwerk-Subnetz 192.168.10. , 192.168.20., 192.168.30. . Ich frage mich, wie jemand BSD-Sockets auf einen Port für eine bestimmte NIC hören, zum Beispiel auf Port 10000 für eth1 hören (192.168.20.), im Moment habe ich das scheint nur auf eth0 list/bind . Das Betriebssystem, das ich momentan benutze, ist Ubuntu, aber ich möchte, dass die Lösung auf jedem posix-System funktioniert.Bindung an eine spezifische NIC in einer posix-Art

Nebenbei: Ich entwickle meine Anwendung in C++, und würde mich über einige Anleitungen zu Netzwerkbibliotheken in C++ freuen. Ich habe mir Qt angesehen, aber die Lizenz ist nicht für die Art der Entwicklung geeignet tun.

Antwort

2

Mit dem Systemaufruf bind() können Sie die Adresse angeben, an die der Socket gebunden werden soll. Sie können eine Bindung an eine bestimmte Adresse herstellen, oder Sie können eine Bindung an INADDR_ANY herstellen, die unabhängig von der Schnittstelle alle eingehenden Adressen überwacht.

Wie für Netzwerkbibliotheken ist boost :: asio gut. Natürlich möchten Sie möglicherweise mehr Anforderungen als "eine Netzwerkbibliothek" angeben, um eine bessere Empfehlung zu erhalten.

0

Wenn Sie BIND eine einzelne Abhörsocket an all IP-Adressen auf dem Host (auf Port 10000, zum Beispiel), das glaube ich nicht, dass es ein allgemeiner Mechanismus ist die IP-Adresse zu bestimmen, an dem ein bestimmtes ACCEPT -ed Verbindung kam.

eine Lösung ist, BIND eine separate Buchse an jedem Ihrer drei IP-Adressen und dann verwenden SELECT für eingehende Verbindungen zu beobachten. So wissen Sie immer, welche eingehende IP-Adresse verwendet wurde.

Wenn Sie die volle Kontrolle über das clientseitige Protokoll haben, können Sie alternativ eine Anforderung erstellen, dass der Client die Ziel-IP überträgt, die unmittelbar nach dem Herstellen einer Socket-Verbindung verwendet wurde. Dadurch können Sie einen einzelnen Server-Socket verwenden, um auf alle eingehenden Verbindungen zu warten, aber Sie müssen den vom Client bereitgestellten Informationen vertrauen.

+3

Sie können 'getsockname()' verwenden, um die lokale Adresse zu ermitteln, die für ein Socket verwendet wurde, das von 'accept()' zurückgegeben wurde. – caf

+0

Wie caf sagte, wenn Sie die Serveradresse für die Schaltung wissen müssen, verwenden Sie 'getsockname()'. Die Verwendung separater Abhörsockets ist in Ordnung, wenn Sie jede der Adressen kennen, die Sie hören möchten. Wenn Sie jedoch alle Schnittstellen abhören möchten, verwenden Sie besser 'IPADDR_ANY' und' getsockname() '. Je nachdem, wie der Kunde Ihnen sagt, scheint das eine rundum schlechte Idee zu sein. Sie geben dies jedoch nicht als eine Anforderung an ... – janm

+0

Ich wusste nicht über getsockname(), danke für den Vorschlag. –