Newsgroup: it.comp.os.linux.development
Titolo: problema con getsockname

Ho un problemino con un piccolo programma che sto scrivendo. Si tratta di
una applicazione client-server in C. Questa è una parte del sorgente del
client:
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/socket.h>  
#include <netinet/in.h> 
void addr_initialize( struct sockaddr_in *indirizzo, char * IPaddr, char *
port)  
{  
  indirizzo->sin_family      = AF_INET;  
  indirizzo->sin_addr.s_addr = inet_addr(IPaddr);  
  indirizzo->sin_port        = htons( (u_short) ( atoi (port) ) );  
} 
int main( int argc, char* argv[] )  
{  
  int sd; 
  struct sockaddr_in server_addr, client_addr;  
    
   if (argc!=3) { 
     fprintf(stderr, "Parametri inesatti. " 
             "Specificare l'indirizzo IP del server e la porta di connesione
\n"); 
     exit(EXIT_FAILURE); 
   } 
    
   addr_initialize(&server_addr, argv[1], argv[2]);  
   /* argv[1]=IPaddr argv[2]=port . per questioni di praticità ho omesso
tutta una serie di check sui valori passati da terminale. */ 
   sd = socket(AF_INET, SOCK_STREAM, 0 );    
    
   if (connect(sd, (struct sockaddr*) &server_addr,  
               sizeof(server_addr)) != 0) { 
     perror("Errore in connect()"); 
     exit(EXIT_FAILURE); 
   } 
    
   getsockname (sd, (struct sockaddr*) &client_addr, (int *)
sizeof(client_addr) );  
            
   printf("Ho effettuato una connessione verso il server. Il tuo IP e' %s e
la tua porta e' %i\n", inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port) ); 
   
        
Io vorrei che in quest'ultima printf compaia, com'è facile intuire,
l'indirizzo IP e la porta dalla quale il client si sta collegando.
Purtroppo l'output che ricevo è senza senso... :-(
Qualcuno potrebbe aiutarmi a capire cosa sbaglio?
-- 
begin  .signature virus! See Microsoft KB Article Q265230 4 more info.
Se vuoi scrivermi, togli "KILLER."
Capisci che il mondo sta impazzendo quando il miglior rapper è un bianco, il
miglior giocatore di golf è di colore, la Svizzera detiene l'America's Cup
di vela, la Francia accusa gli Stati Uniti di arroganza e la Germania non
vuole entrare in guerra e il miglior pizzaiolo a Napoli è un giapponese.

 Qualcuno potrebbe aiutarmi a capire cosa sbaglio?
Sicuramente ti saresti accorto dell'errore controllando lo stato di
ritorno di getsockname() -> -1. Errno viene settata a:
EFAULT: The name parameter points to memory not in a valid part of the
        process address space.
quindi controlli il prototipo della funzione:
int getsockname(int s, struct sockaddr *name, socklen_t *namelen);
e vedi che come terzo parametro vuole il puntatore a un "intero", quindi
risolvi il tutto facendo così:
int main ( .. )
{
	int s;
	..
	..
	s = sizeof( client_addr );
	getsockname (sd, (struct sockaddr*) &client_addr, &s );
	..
}
Ciao
Matic

 getsockname (sd, (struct sockaddr*) &client_addr, &s );
Matic ti ringrazio per la risposta. Alla fine andando a rivedere altri
programmi che avevo fatto mi sono accorto dell'errore e mi è tornato in
mente perchè avevo scritto quella cosa lì...
Il mio tentativo era quello di non dover definire una variabile intera s, ma
di infilare il sizeof direttamente nel getsockname, un po' come si fa nella
connect:
connect(sd, (struct sockaddr*) &server_addr, sizeof(server_addr) )
secondo te è possibile implementare una cosa del genere? o devo rassegnarmi
a dichiarare sempre un intero per il sizeof della getsockname? :-)
saludos
.:deadhead:.


 .:deadhead:.
Ciao
Matic