Frage zu INADDR_ANY
Die Konstante INADDR_ANY ist das so genannte IPv4 Platzhalter-Adresse. Die
wildcard-IP-Adresse ist nützlich für Anwendungen, die binden Internet
domain-sockets, die auf mehrfach vernetzten hosts. Wenn eine Anwendung auf einem mehrfach vernetzten
host bindet einen socket an nur eine host-IP-Adressen, dann
socket empfangen kann nur der UDP Datagramm oder TCP-Verbindungs-Anfragen
die IP-Adresse. Jedoch wollen wir jedoch eine Anwendung auf einem
multihomed-host in der Lage sein zum empfangen von Datagrammen oder Verbindungsanforderungen
angeben, dass der host-IP-Adressen und binden Sie den socket an
die wildcard-IP-Adresse macht es möglich.
struct sockaddr_in server_address;
int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_address, 0, sizeof(struct sockaddr_in));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY); //here is my quesion
server_address.sin_port = htons(9734);
bind(server_sockfd, (struct sockaddr*)&server_address, sizeof(server_address));
Frage>
Wenn wir binden Sie den socket an eine bestimmte IP-Adresse, dann kann die Steckdose nur erhalten UPD/TCP-Anfragen gesendet, um die IP-Adresse.
Als ich in dem obigen code wird nun die Buchse server_sockfd ist gebunden INADDR_ANY.
Ich fühle mich einfach verwirrt hier b/c, wenn der socket empfangen kann jede Anfrage auf das internet, wie es kann immer noch gut arbeiten. Es gibt Unmengen von Anfragen von UDP/TCP auf internet, wenn der socket-Antworten an alle
wie kann es noch funktionieren?
//aktualisiert-code für die client-Seite //
int
main(int argc, char *argv[])
{
struct sockaddr_in6 svaddr;
int sfd, j;
size_t msgLen;
ssize_t numBytes;
char resp[BUF_SIZE];
if (argc < 3 || strcmp(argv[1], "--help") == 0)
usageErr("%s host-address msg...\n", argv[0]);
/* Create a datagram socket; send to an address in the IPv6 somain */
sfd = socket(AF_INET6, SOCK_DGRAM, 0); /* Create client socket */
if (sfd == -1)
errExit("socket");
memset(&svaddr, 0, sizeof(struct sockaddr_in6));
svaddr.sin6_family = AF_INET6;
svaddr.sin6_port = htons(PORT_NUM);
if (inet_pton(AF_INET6, argv[1], &svaddr.sin6_addr) <= 0)
fatal("inet_pton failed for address '%s'", argv[1]);
/* Send messages to server; echo responses on stdout */
for (j = 2; j < argc; j++) {
msgLen = strlen(argv[j]);
if (sendto(sfd, argv[j], msgLen, 0, (struct sockaddr *) &svaddr,
sizeof(struct sockaddr_in6)) != msgLen)
fatal("sendto");
numBytes = recvfrom(sfd, resp, BUF_SIZE, 0, NULL, NULL);
if (numBytes == -1)
errExit("recvfrom");
printf("Response %d: %.*s\n", j - 1, (int) numBytes, resp);
}
exit(EXIT_SUCCESS);
}
//aktualisiert für server-side-code
int
main(int argc, char *argv[])
{
struct sockaddr_in6 svaddr, claddr;
int sfd, j;
ssize_t numBytes;
socklen_t len;
char buf[BUF_SIZE];
char claddrStr[INET6_ADDRSTRLEN];
/* Create a datagram socket bound to an address in the IPv6 somain */
sfd = socket(AF_INET6, SOCK_DGRAM, 0);
if (sfd == -1)
errExit("socket");
memset(&svaddr, 0, sizeof(struct sockaddr_in6));
svaddr.sin6_family = AF_INET6;
svaddr.sin6_addr = in6addr_any; /* Wildcard address */
svaddr.sin6_port = htons(PORT_NUM);
if (bind(sfd, (struct sockaddr *) &svaddr,
sizeof(struct sockaddr_in6)) == -1)
errExit("bind");
/* Receive messages, convert to uppercase, and return to client */
for (;;) {
len = sizeof(struct sockaddr_in6);
numBytes = recvfrom(sfd, buf, BUF_SIZE, 0,
(struct sockaddr *) &claddr, &len);
if (numBytes == -1)
errExit("recvfrom");
/* Display address of client that sent the message */
if (inet_ntop(AF_INET6, &claddr.sin6_addr, claddrStr,
INET6_ADDRSTRLEN) == NULL)
printf("Couldn't convert client address to string\n");
else
printf("Server received %ld bytes from (%s, %u)\n",
(long) numBytes, claddrStr, ntohs(claddr.sin6_port));
for (j = 0; j < numBytes; j++)
buf[j] = toupper((unsigned char) buf[j]);
if (sendto(sfd, buf, numBytes, 0, (struct sockaddr *) &claddr, len) !=
numBytes)
fatal("sendto");
}
}
//aktualisiert, wie laufen diese server/client-Programme.
$ ./server_program &
[1] 31047
$ ./client_program ::1 ciao //Send to server on local host
Server received 4 bytes from (::1, 32770)
Response 1: CIAO
InformationsquelleAutor q0987 | 2011-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es nicht get-Anforderungen für jede IP-Adresse im internet(a), erhält Sie Anfragen für jede IP-Adresse, die it-services. Zum Beispiel kann es mehrere NICs haben, die jeweils mit einer separaten IP-Adresse, oder es kann ein einzelnes NIC der Lage, die Verwaltung mehrerer IP-Adressen (es können auch mehrere NICs haben, jeder in der Lage Umgang mit mehreren IP-Adressen.
Den Schlüssel snippet zu betrachten ist:
In anderen Worten, Sie haben ein multi-homed-set-up, wo deine Maschine services
10.0.0.15
und10.0.0.16
. MitINADDR_ANY
wird Ihnen erlauben, zu Holen, Verkehr für beide Adressen, ohne Abholung Anfragen für10.0.0.17
werden kann, die Maschine auf dem anderen Ende der Bank (oder anderen Seite des Planeten).Die folgende Tabelle, mit der oberen Zeile sein Wunsch-Destinationen und der linken Spalte wird die Adresse, die du hörst, zeigt, ob Sie eine Anfrage (
Y
) oder nicht (N
):(a) ist Es nicht sogar sehen die überwiegende Mehrheit der Anfragen über das Netz. Die überwiegende Mehrheit weiß nicht einmal machen es zum nächsten router (oder wahrscheinlich sogar Ihren ISP). Auch diejenigen, die tun machen Sie es zu Ihrem nächsten router, Ihre Maschine möglicherweise nicht angezeigt, wenn Sie bestimmt für eine andere Maschine auf dem lokalen segment (promiscuous-Modus abweichend).
Finden Sie die aktualisierte client-seitigen code. Der client-seitige code nicht geben Sie die IP-Adresse des Servers, in deinem Fall ist es nicht geben Sie eine beliebige ip im Bereich von 10.0.0.15 zu 10.0.0.16. Wie funktioniert dann der server wissen, dass der client sendet die Anfrage?
ein socket-server nicht erreichen Datenverkehr von einem client, die nicht geben Sie eine IP-Adresse zu senden (auch wenn es eine broadcast-Adresse, die angegeben werden kann). Ebenso der server, um anzugeben, eine Adresse zu empfangen, aber, dass die Adresse "die Adressen dieser computer"
Ihrem client-code nicht geben Sie die Adresse des Servers, mit
inet_pton
aufargv[1]
. Dieser Aufruf nimmt die Form der Präsentation wie10.0.0.15
und verwandelt es in ein binäres Netzwerk-Adresse. In anderen Worten, es ist in der Befehlszeile übergeben. Siehe kernel.org/doc/man-pages/online/pages/man3/inet_pton.3.htmlnicht ganz.
::1
ist eine IP-Adresse und geben Sie es. Es ist das IPv6-äquivalent von der IPv4-Adresse 127.0.0.1. Die loopback-Adresse (localhost) ist die Bequemlichkeit, das meine gegenwärtige Gastgeber-aber es ist genauso gültig ist wie jede andere IP-Adresse. Es ist fast sicher eine der IP-Adressen, die gewartet werden durch die Angabe INADDR_ANY.InformationsquelleAutor paxdiablo