Ich habe einen Server mit einem eingehenden Socket von einem Client. Ich brauche die IP-Adresse des Remote-Clients. Erprobte Suche nach Google nach in_addr
, aber es ist ein bisschen mühsam. Irgendwelche Vorschläge?Abrufen der Quelladresse einer eingehenden Socket-Verbindung
Antwort
Sie benötigen die getpeername
Funktion. Der große Beej's Leitfaden zum Networking hat eine page about it. Hier ist ein Codebeispiel von dort:
// assume s is a connected socket
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
+1. Aber müssen wir dafür keine Speicher frei machen? – iammilind
Ich bemerke, dass 'struct sockaddr_in * s' den Socket' s' im äußeren Bereich schattiert. Eine beschattete Variable ist nicht ideal. –
gibt es eine Möglichkeit, den SocketDescriptor von der Adresse – Bionix1441
Da Sie sagen, es ist eine eingehende Verbindung von einem Client, als Alternative zu getpeername
Sie können einfach die Adresse speichern, die von dem accept()
Aufruf zurückgegeben wurde, in den zweiten und dritten Parameter.
Angenommen, Sie verwenden accept()
, um eingehende Socket-Verbindungen zu akzeptieren, wird getpeername()
nicht benötigt. Die Adressinformation steht über den 2. und 3. Parameter des accept()
Aufrufs zur Verfügung.
Hier ist die Antwort von Eli geändert, es zu tun, ohne getpeername()
:
int client_socket_fd;
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
+1 für die direkte Verwendung von 'accept()' zu erhalten. Aber müssen wir dafür keine Speicher frei machen? – iammilind
@iammilind: Ich denke nicht, dass irgendwelche Speicher freigegeben werden müssen - ich kann keine dynamischen Zuordnungen sehen. Es ist alles mit statisch zugewiesenen Variablen getan. –
- 1. Abrufen von Quelladresse in einer recvmmsg UDP Socket
- 2. in Android abrufen Telefonnummer des eingehenden Anrufs
- 3. Abrufen mehrerer Abfrageparameter vom eingehenden Gateway
- 4. jmeter Nicht-GUI-Testplan mit Quelladresse Spoofing
- 5. Überprüfung auf eingehenden Datentyp aus der Datei
- 6. Dynamische Konfiguration der eingehenden WSO2ESB-Endpunkte
- 7. Ermitteln der IP-Adresse und des Ports einer eingehenden TCP/IP-Verbindung in Erlang
- 8. SendGrid analysiert eingehenden Header
- 9. Android eingehenden Anruf Bildschirm
- 10. Aufruf der URL auf der Basis der eingehenden URL
- 11. Rubin - Anfrage Körper von eingehenden HTTP-Aufruf
- 12. Applescript Inhalt von eingehenden iMessage
- 13. Ruby - Eingehenden HTTP POST behandeln?
- 14. eingehenden Text zu einem Facebook-Bot ändern
- 15. Abbrechen der Auswahländerung an einer JComboBox, wenn die Bedingung erfüllt ist (zB Überprüfung der eingehenden Auswahl)
- 16. Finde neo4j Knoten mit mehr als einer eingehenden Beziehung
- 17. Recv eingehenden Datenverkehr vom Server
- 18. Android: Abrufen des Kontaktnamens von der Telefonnummer
- 19. Blockiert Application_Start alle eingehenden Anforderungen
- 20. Überprüfung eingehenden Anruf in iphone
- 21. Ablehnen eingehenden Anruf in Android
- 22. Wie man eingehenden Strom in wowza von einer Datei einrichtet?
- 23. Wie JSON einer eingehenden POST-Anforderung in Rails zu analysieren?
- 24. Abrufen der ersten Ziffer einer Nummer
- 25. Abrufen der gesamten Zeilennummern in einer Datei
- 26. Abrufen der ausgewählten Kontrollkästchenwerte aus einer ValidationGroup
- 27. Abrufen der SQL aus einer Doctrine-Migration
- 28. Abrufen der Caret-Position in einer RichTextBox
- 29. Abrufen der String-Wert aus einer NSArray
- 30. Abrufen der Clustergröße einer Festplatte (über Code)
in_addr IPv4-spezifisch ist, sowieso – bortzmeyer
man getpeername
–inet_ntoa (..) Funktion in Linux .. 'Mann inet_ntoa' zu sehen. es ist einfacher als inet_ntop meiner Meinung nach und einschließlich arpa/inet.h. Hier ist ein Beispiel: http://www.binarytides.com/programming-udp-sockets-c-linux/ – mhk