PDA

View Full Version : [C] Socket TCP/UDP.Come ricavo l'ip locale??


parisisalvo
10-11-2005, 16:58
Supponiamo di avere 2 macchine
una con una scheda di rete avente indirizzo 192.168.3.1 (server) di cui conosco l'ip
e un'altra macchina, con scheda di rete 192.168.3.x (con x>1) che si connette al server di cui conosce l'indirizzo.

La connessione TCP avviene con

struct sockaddr_in server_tcp;
server_tcp.sin_family = AF_INET;
server_tcp.sin_port = htons(PORT_TCP);
if ( (inet_pton(AF_INET,"192.168.3.1", &server_tcp.sin_addr)) <= 0)
{
perror("Address creation error");
}
if ((sock_tcp = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}

printf(" Mi connetto al server via TCP ... in attessa di risposta\n");
if (connect(sock_tcp, (struct sockaddr *)&server_tcp, sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}


Io so l'ip del server, ma se volessi conoscere quello mio?
Ossia l'indirizzo (liv3-ip) della scheda di rete che si sta collegando al server?

ilsensine
10-11-2005, 17:28
Dopo la connect, esegui:

struct sockaddr_in addr;
socklen_t len = sizeof(addr);
getsockname(socket_fd, (struct sockaddr *) &addr, &len);

Il risultato lo hai nel campo addr.sin_addr (che è una struct sin_addr).

Sì, chi ha stabilito questi standard fumava roba illegale.

parisisalvo
10-11-2005, 18:49
Ciao ilsensine,
grazie mille per la risposta...
una cosa, ovviamente socket_fd, che uso in getsockname, ha funzionalita' dopo la connect (socket_fd, ... , ... ) giusto?
ossia, se eseguo
getsockname(socket_fd, (struct sockaddr *) &addr, &len);
prima della connect mi torna 0.0.0.0

ilsensine
11-11-2005, 09:18
Ciao ilsensine,
grazie mille per la risposta...
una cosa, ovviamente socket_fd, che uso in getsockname, ha funzionalita' dopo la connect (socket_fd, ... , ... ) giusto?
Sì certo.

ossia, se eseguo
getsockname(socket_fd, (struct sockaddr *) &addr, &len);
prima della connect mi torna 0.0.0.0
Perché prima della "connect" il sistema ancora non sa per quale interfaccia di rete uscirai, quindi non sono stati ancora assegnati IP e porta locali.