Ich versuche einige Sockets zu programmieren und benutze sie daher auf der Serverseite htonl(INADDR_ANY)
. Soweit ich verstanden habe, scheint mir diese Funktion eine zufällige IP zu generieren (bin ich richtig?). Tatsächlich möchte ich meine Steckdose mit meiner binden localhost
. Aber wenn ich das mache
printf("%d",htonl(INADDR_ANY));
Ich bekomme 0 als Rückgabewert. Könnte jemand eine Erklärung bringen?
htonl(INADDR_ANY)
. Das Dokument sagt, dass diese Funktion eine zufällige IP generiert ... " Dies ist nicht korrekt. Welche Dokumente sagen es Ihnen?Antworten:
bind()
vonINADDR_ANY
tut NICHT „eine zufällige IP erzeugen“. Es bindet den Socket an alle verfügbaren Schnittstellen .Bei einem Server möchten Sie normalerweise an alle Schnittstellen binden - nicht nur an "localhost".
Wenn Sie Ihren Socket nur an localhost binden möchten, lautet die Syntax:
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
Rufen Sie dann aufbind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
.Zufällig
INADDR_ANY
ist eine Konstante gleich "Null":http://www.castaglia.org/proftpd/doc/devel-guide/src/include/inet.h.html
# define INADDR_ANY ((unsigned long int) 0x00000000) ... # define INADDR_NONE 0xffffffff ... # define INPORT_ANY 0 ...
Wenn Sie noch nicht damit vertraut sind, empfehlen wir Ihnen, den Beej-Leitfaden zur Sockets-Programmierung zu lesen:
http://beej.us/guide/bgnet/
Da die Leute dies noch lesen, ein zusätzlicher Hinweis:
Ebenfalls:
quelle
INADDR_LOOPBACK
stattinet_addr("127.0.0.1")
?INADDR_ANY
wird verwendet, wenn Sie keinen Socket an eine bestimmte IP binden müssen. Wenn Sie diesen Wert beim Anrufen als Adresse verwendenbind()
, akzeptiert der Socket Verbindungen zu allen IP- Adressen des Computers.quelle
Um binden Buchse mit localhost , bevor Sie rufen Sie die bind Funktion sollte sin_addr.s_addr Feld der sockaddr_in Struktur richtig eingestellt werden. Der richtige Wert kann entweder durch erhalten werden
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")
oder von
quelle
INADDR_ANY
Weist den Listening-Socket an, sich an alle verfügbaren Schnittstellen zu binden. Es ist das gleiche wie der Versuch, sich zu bindeninet_addr("0.0.0.0")
. Der Vollständigkeit halber werde ich auch erwähnen, dass es auch IN6ADDR_ANY_INIT für IPv6 gibt und es das gleiche ist wie der Versuch, an die::
Adresse für den IPv6-Socket zu binden .#include <netinet/in.h> struct in6_addr addr = IN6ADDR_ANY_INIT;
Beachten Sie außerdem, dass beim Binden des IPv6-Sockets an
IN6ADDR_ANY_INIT
Ihren Socket alle IPv6-Schnittstellen gebunden werden und auch Verbindungen von IPv4-Clients akzeptiert werden sollten (obwohl IPv6-zugeordnete Adressen).quelle
INADDR_ANY ist eine Konstante, deren Wert 0 enthält. Dies wird nur verwendet, wenn Sie eine Verbindung von allen aktiven Ports herstellen möchten, für die Sie sich nicht für IP-Add interessieren. Wenn Sie also eine bestimmte IP-Adresse verbinden möchten, sollten Sie Folgendes als my_sockaddress.sin_addr.s_addr = inet_addr ("192.168.78.2") angeben.
quelle