Ho fatto qualche cambiamento nella parte relativa alla risoluzione dei nomi... Non c'entra nulla con il problema precedente, ma poiche' ho visto che la funzione
gethostbyname() e' ormai deprecata, l'ho sostituita con
getaddrinfo() (standard POSIX 1003.1-2001). Solo che adesso succede qualcosa di inaspettato. Non vi posto tutto il codice, vi descrivo sommariamente cosa faccio:
1) Nella funzione main() inizializzo i socket per le connessioni, e metto in ascolto il socket associato al server;
2) quando arriva una nuova connessione, genero un processo figlio che si occupa di gestirla, mentre il padre torna in attesa di nuove connessioni;
3) il processo figlio legge sul socket la richiesta inviata dal browser (per ora supporta solo le GET), ne estrae l'URL richiesto e il nome dell'host dove reperirlo, quindi invoca la funzione
id_gethostbyname() (opera mia) per la risoluzione dei nomi a dominio, che e' la seguente:
Codice:
/* Function: id_gethostbyname()
*
* Purpose: try to get the IPv4 address of the host whose name is passed
* with the info->h_name string.
*
* Parameters:
* - struct req_info *info: a pointer to a (preallocated) structure of
* req_info type, in which will be stored the response information.
*
* Return value:
*
* 0 on success, in which case the function returns the IP address
* in the h_addr field of info structure passed in;
*
* -1 on error.
*/
int
id_gethostbyname(struct req_info *info)
{
int ret; /* return value */
struct addrinfo hints; /* hints for the research */
struct addrinfo *res; /* research result */
/* hints initialization: we need an IPv4 address to
* use in a SOCK_STREAM TCP socket */
hints.ai_flags=0;
hints.ai_family=PF_INET;
hints.ai_socktype=SOCK_STREAM;
hints.ai_protocol=0;
ret=getaddrinfo(info->h_name, NULL, &hints, &res);
if (ret!=0)
{
printf("Resolution error: %s\n", gai_strerror(ret));
return -1;
}
while (res!=NULL)
{
if (res->ai_family==PF_INET)
{
info->h_addr.sa_family=res->ai_addr->sa_family;
strncpy(info->h_addr.sa_data, res->ai_addr->sa_data, 14);
break;
}
else res=res->ai_next;
}
freeaddrinfo(res);
return 0;
}
La definizione della struttura req_info e' la seguente:
Codice:
struct req_info
{
char URI[URL_MAX];
char h_name[NAME_MAX];
struct sockaddr h_addr;
};
e la uso semplicemente per memorizzare i vari campi che mi interessano.
Quando invoco la funzione id_gethostbyname(), passo come argomento l'indirizzo della variabile
info , nel cui campo h_name c'e' il nome dell'host di cui voglio l'indirizzo.
Ho eseguito il programma anche con il debugger (gdb), e la cosa strana e' che il processo figlio (che invoca la funzione incriminata) termina correttamente ma, subito dopo la sua terminazione, termina anche il padre e mi viene stampato questo strano messaggio:
Quote:
|
./proxy: symbol lookup error: ./proxy: undefined symbol: close, version GLIBC_2.0
|
dove
proxy e' il nome dell'eseguibile...
Qualche idea? Anche non strettamente correlata alla funzione, ma piu' al comportamento del programma e all'errore stampato.
Grazie,
Gica
PS: non fate troppo caso al mio inglese maccheronico...