huntercity
05-07-2002, 16:53
per quale maledetto motivo mi da segmentation fault in questo pezzo di codice ??
# include "header.h"
void timeout(int sig);
int main (int argc, char* argv[])
{
char *hostA;
char *hostB;
char *dir1;
char *dir2;
int i,j,len;
char *tmp;
BOOL ondemand = FALSE;
int sec = 10;
int server_socket,connect_socket;
unsigned int client_addr_len;
int retcode;
struct sockaddr_in client_addr, server_addr;
char localname[MAXSTRING];
char *remote_host_name;
struct hostent *local, *remote, *myhost;
MESSAGGIO msg;
if ((argc<3) || (argc>4))
{
printf("Usa sincronizza hostA:dir1 hostB:dir2 [-ondemand]\n");
return(-1);
}
.......................
/* creazione del socket */
/*printf("SINCRONIZZA: fase di inizializzazione\n"); */
server_socket = socket(AF_INET,SOCK_STREAM,0);
if(server_socket == -1) {
perror("SINCRONIZZA: aprendo il socket");
exit(-1);
}
/* pubblicazione dell'indirizzo */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVERPORT);
if(gethostname(localname,MAXBUFFER) == -1) {
perror("SINCRONIZZA: cercando il nome dell'host");
exit(-1);
}
[color=red]
/* fino a qui ci arrivo */
remote = gethostbyname(hostB);
/* qui non ci arrivo mi da un bel segmentation fault */
[/color]
remote_host_name = (char *) malloc (strlen(remote->h_name));
sprintf(remote_host_name,"%s",remote->h_name);
local = gethostbyname(localname);
if(strcmp(local->h_name, remote_host_name)==0)
myhost = gethostbyname("127.0.0.1");
else myhost = local;
free(remote_host_name);
memcpy(&server_addr.sin_addr,myhost->h_addr,
sizeof(server_addr.sin_addr));
retcode = bind(server_socket,
(struct sockaddr *)&server_addr,
sizeof(server_addr));
if(retcode == -1) {
perror("SINCRONIZZA: pubblicando il socket");
exit(-1);
}
/* accetto solo una connessione per volta */
listen(server_socket,1);
/* sistemazione delle cose per il timeout */
signal(SIGALRM, timeout);
siginterrupt(SIGALRM,1);
/* ciclo di accettazione delle connessioni */
/* printf("SINCRONIZZA: attendo connessione\n");*/
client_addr_len = sizeof(client_addr);
alarm(sec);
connect_socket = accept(server_socket,(struct sockaddr *) & client_addr,&client_addr_len);
if ((connect_socket==-1) || errno == EINTR)
{
perror("SINCRONIZZA: Accettando la connessione o Timeout scaduto \n");
exit(-1);
}
alarm(0);
printf("SINCRONIZZA: Aspetto 'AVVIATO' da SINCD\n");
/* leggo un msg */
retcode = read(connect_socket,(char *)&msg,sizeof(msg));
if(retcode == -1)
{
perror("SINCRONIZZA: leggendo il msg di avvio da SINCD");
close(connect_socket);
exit(-1);
}
printf("SINCRONIZZA: SINCD mi ha inviato %s\n",msg.msg);
/* trattamento della terminazione della connessione */
printf("SINCRONIZZA: Fine del messaggio, chiusura della connessione\n");
close(connect_socket);
mi esplode quando faccio la gethostbyname
pero' con il gdb funziona a run-time mi da segmentation fault
qualcuno ravvisa qualche errore??
ho provato anche ad allocare prima remote con una malloc ma il risultato non cambia, poi ho visto dal man che gethostbyname restituisce un puntatore quindi penso che la struttura la crei lui
grazie
# include "header.h"
void timeout(int sig);
int main (int argc, char* argv[])
{
char *hostA;
char *hostB;
char *dir1;
char *dir2;
int i,j,len;
char *tmp;
BOOL ondemand = FALSE;
int sec = 10;
int server_socket,connect_socket;
unsigned int client_addr_len;
int retcode;
struct sockaddr_in client_addr, server_addr;
char localname[MAXSTRING];
char *remote_host_name;
struct hostent *local, *remote, *myhost;
MESSAGGIO msg;
if ((argc<3) || (argc>4))
{
printf("Usa sincronizza hostA:dir1 hostB:dir2 [-ondemand]\n");
return(-1);
}
.......................
/* creazione del socket */
/*printf("SINCRONIZZA: fase di inizializzazione\n"); */
server_socket = socket(AF_INET,SOCK_STREAM,0);
if(server_socket == -1) {
perror("SINCRONIZZA: aprendo il socket");
exit(-1);
}
/* pubblicazione dell'indirizzo */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVERPORT);
if(gethostname(localname,MAXBUFFER) == -1) {
perror("SINCRONIZZA: cercando il nome dell'host");
exit(-1);
}
[color=red]
/* fino a qui ci arrivo */
remote = gethostbyname(hostB);
/* qui non ci arrivo mi da un bel segmentation fault */
[/color]
remote_host_name = (char *) malloc (strlen(remote->h_name));
sprintf(remote_host_name,"%s",remote->h_name);
local = gethostbyname(localname);
if(strcmp(local->h_name, remote_host_name)==0)
myhost = gethostbyname("127.0.0.1");
else myhost = local;
free(remote_host_name);
memcpy(&server_addr.sin_addr,myhost->h_addr,
sizeof(server_addr.sin_addr));
retcode = bind(server_socket,
(struct sockaddr *)&server_addr,
sizeof(server_addr));
if(retcode == -1) {
perror("SINCRONIZZA: pubblicando il socket");
exit(-1);
}
/* accetto solo una connessione per volta */
listen(server_socket,1);
/* sistemazione delle cose per il timeout */
signal(SIGALRM, timeout);
siginterrupt(SIGALRM,1);
/* ciclo di accettazione delle connessioni */
/* printf("SINCRONIZZA: attendo connessione\n");*/
client_addr_len = sizeof(client_addr);
alarm(sec);
connect_socket = accept(server_socket,(struct sockaddr *) & client_addr,&client_addr_len);
if ((connect_socket==-1) || errno == EINTR)
{
perror("SINCRONIZZA: Accettando la connessione o Timeout scaduto \n");
exit(-1);
}
alarm(0);
printf("SINCRONIZZA: Aspetto 'AVVIATO' da SINCD\n");
/* leggo un msg */
retcode = read(connect_socket,(char *)&msg,sizeof(msg));
if(retcode == -1)
{
perror("SINCRONIZZA: leggendo il msg di avvio da SINCD");
close(connect_socket);
exit(-1);
}
printf("SINCRONIZZA: SINCD mi ha inviato %s\n",msg.msg);
/* trattamento della terminazione della connessione */
printf("SINCRONIZZA: Fine del messaggio, chiusura della connessione\n");
close(connect_socket);
mi esplode quando faccio la gethostbyname
pero' con il gdb funziona a run-time mi da segmentation fault
qualcuno ravvisa qualche errore??
ho provato anche ad allocare prima remote con una malloc ma il risultato non cambia, poi ho visto dal man che gethostbyname restituisce un puntatore quindi penso che la struttura la crei lui
grazie