Ho un server con un socket in ingresso da un client. Ho bisogno di ottenere l'indirizzo IP del client remoto. Provato a cercare google per in_addr
ma è un po 'fastidioso. Qualche suggerimento?Ottenere l'indirizzo di origine di una connessione socket in entrata
risposta
È necessaria la funzione getpeername
. La grande guida di Beej alla rete ha un page about it. Ecco un esempio di codice da lì:
// 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. Tuttavia, non dobbiamo liberare memoria per questo? – iammilind
Ho notato che 'struct sockaddr_in * s' ombreggia il socket' s' nello scope esterno. Avere una variabile ombreggiata non è l'ideale. –
c'è un modo per ottenere il socketDescriptor dall'indirizzo – Bionix1441
Dal momento che si dice che è una connessione in entrata da un client, come alternativa al getpeername
si può solo salvare l'indirizzo che è stato restituito dalla chiamata accept()
, nel secondo e terzo parametri.
Supponendo che si utilizzi accept()
per accettare le connessioni socket in entrata, getpeername()
non è necessario. Le informazioni sull'indirizzo sono disponibili tramite il 2 ° e il 3 ° parametro della chiamata accept()
.
Qui è la risposta di Eli modificato per farlo senza 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 per l'uso diretto di 'accept()'. Tuttavia, non dobbiamo liberare memoria per questo? – iammilind
@iammilind: Non penso che sia necessario liberare memoria: non riesco a vedere alcuna allocazione dinamica eseguita. È tutto fatto con variabili allocate staticamente. –
- 1. Numero di porta di origine socket impostato
- 2. Determinazione dell'indirizzo IP e della porta di una connessione TCP/IP in entrata in Erlang
- 3. Regole di connessione socket persistente Android
- 4. mocking una connessione socket in Python
- 5. Come effettuare una connessione multipla dall'endpoint di origine in jsplumb
- 6. Apertura di una connessione socket SSL in Python
- 7. Come prendere in giro una connessione socket in uscita?
- 8. connessione SSL Socket iOS
- 9. Timeout connessione socket Python
- 10. Ricollegare una connessione socket Java su disconnessione
- 11. C, Socket: errore di connessione rifiutata
- 12. utilizzando una connessione socket non bloccante in C
- 13. Timeout connessione socket Android
- 14. HTTP connessione persistente vs connessione socket TCP
- 15. Porta di origine e di destinazione per il socket UDP?
- 16. TCP Socket nessun timeout di connessione
- 17. Connessione a un'interfaccia utente di blocco socket
- 18. Ottenere l'HTML di origine da una WebView in Cocoa
- 19. ottenere flusso di un oggetto socket in C#
- 20. Ottenere il SessionFactory per una particolare origine dati in Grails
- 21. come creare la connessione Socket in Android?
- 22. Come distruggere completamente una connessione socket in C
- 23. Linux, socket, connessione non bloccante
- 24. Rileva origine connessione desktop remota
- 25. Come posso rifiutare una connessione socket in C?
- 26. Connessione socket PHP tramite proxy
- 27. Connessione socket TLS tramite Nodejs
- 28. Come ottenere una connessione senza proxy in Java?
- 29. Haskell - Connessione socket lenta con filettatura
- 30. Come posso fare una connessione socket client/client (browser)?
in_addr è IPv4-specifici, in ogni caso – bortzmeyer
man getpeername
–vedi funzione inet_ntoa (..) in linux .. 'uomo inet_ntoa'. è più facile di inet_ntop secondo me e ha bisogno di includere arpa/inet.h. ecco un esempio: http://www.binarytides.com/programming-udp-sockets-c-linux/ – mhk