2012-01-18 18 views
5

Tengo un problema con la función de conexión cuando paso un nombre de host no válido.Programación de socket C unix, connect() colgando en el nombre de host no válido

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define ERROR_NUM   -1 
#define BUFFER_SIZE   500 
#define HOST_NAME_SIZE  255 
#define MY_ID  5 

int main(int argc, char* argv[]) 
{ 
int hSocket;     /* handle to socket */ 
struct hostent* pHostInfo; /* holds info about a machine */ 
struct sockaddr_in Address; /* Internet socket address stuct */ 
long nHostAddress; 
char pBuffer[BUFFER_SIZE]; 
char userName[BUFFER_SIZE]; 
char hostName[HOST_NAME_SIZE]; 

if(argc < 2){ 
    printf("\nUsage: [email protected]\n"); 
    return 0; 
}else{ 
    int i = 0; 
    int length; 
    if((length = strlen(argv[1])) >= BUFFER_SIZE){ 
     printf("Argument entered is too long\n"); 
     return 0; 
    } 
    while(*(argv[1] + i) != '@'){ 
     ++i; 
     if(i >= length){ 
      printf("Usage: [email protected]\n"); 
      return 0; 
     } 
    } 
    strncpy(userName, argv[1], i); 
    argv[1]+=(i+1); 
    strcpy(hostName,argv[1]); 
} 

printf("\nMaking a socket\n"); 
if((hSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == ERROR_NUM){ 
    printf("\nCould not make a socket\n"); 
    return 0; 
} 

/* get IP address from name */ 
pHostInfo=gethostbyname(hostName); 
if(!pHostInfo){ 
    printf("Could not resolve host name\n"); 
    return 0; 
} 
/* copy address into long */ 
memset(&nHostAddress, 0, sizeof(nHostAddress)); 
memcpy(&nHostAddress,pHostInfo->h_addr,pHostInfo->h_length); 

/* fill address struct */ 
Address.sin_addr.s_addr=nHostAddress; 
Address.sin_family=AF_INET; 
/* finding host port num */ 
int x = 5000 + (MY_ID-1)* 10; 
int y = 5000 + (MY_ID*10) - 1; 
for(x; x <= y; ++x){ 
    Address.sin_port=htons(x); 
    if(connect(hSocket,(struct sockaddr*)&Address,sizeof(Address)) > ERROR_NUM){ 
     break; 
    } 
} 
if(x > y){ 
    printf("\nFailed to connect to host port\n"); 
    return 0; 
} 
printf("\nConnected to %s on port %d\n", hostName, x); 
printf("Client closing socket\n\n");      
if(close(hSocket) == ERROR_NUM){ 
    printf("\nCould not close socket\n"); 
    return 0; 
} 

Connect() está colgando si doy un nombre de host no válido como argumento. Si doy un nombre de host válido, todo funciona de acuerdo con el plan. Un nombre de host válido pero no válido irá a devolver 0. Mi pregunta es, ¿por qué está colgando y no devuelve -1 cuando doy un nombre de host no válido?

Gracias por cualquier ayuda

+2

¿Porque no está verificando el valor de retorno de 'gethostbyname'? –

+0

No se debe conectar todavía return -1 si el fundo gethostbyname() no encuentra la dirección? Que luego asignaría NULL a pHostInfo. Lo probaré y veré qué pasa. Y lo ejecutaré a través de gdb para ver qué gethostbyname() en realidad está asignando con un nombre de host incorrecto y le respondo en breve. – pandaEater

+0

no, probablemente intente conectarse a una dirección que es memoria no inicializada (o tal vez '0.0.0.0', dependiendo de la implementación). Sospecho que wireshark te mostrará los paquetes que salen y no hay respuestas, y si esperas lo suficiente, tu conexión eventualmente terminará. –

Respuesta

2

Usted debe comprobar el valor de retorno de gethostbyname. Si falla, su programa actual exhibe un comportamiento indefinido porque está desreferenciando un puntero nulo.

+0

Oop, buena captura, se olvidó de que 'gethostbyname' devolvió' NULL'. –

+0

Acabo de agregar el código en la edición anterior sin suerte. ¿Alguna sugerencia? – pandaEater

+0

@pandaEater: difícil de decir. Ni siquiera puedo compilar tu código debido a la asignación errónea a 'strHostName'. –

Cuestiones relacionadas