2012-01-18 19 views
5

Geçersiz bir ana bilgisayar adı geçtiğimde bağlantı işleviyle asılı bir sorun yaşıyorum. Ben bağımsız değişken olarak geçersiz ana bilgisayar adını verirsenC unix soket programlama, connect() geçersiz anasistem adı üzerinde asılı

#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; 
} 

Bağlan() asılı. Geçerli bir ana bilgisayar adı verirsem her şey plana göre çalışır. Geçerli bir ana bilgisayar adı ancak geçersiz bağlantı noktası 0'a dönecektir. Sorum, geçersiz bir ana bilgisayar adı verdiğimde -1 neden askıda kalıyor ve dönmüyor? herhangi bir yardım

+2

Çünkü gethostbyname öğesinin dönüş değerini kontrol etmiyor musunuz? –

+0

gethostbyname() func adresi bulamıyorsa hala dönüş yapmamalısınız -1. Hangisi daha sonra pHostInfo'ya NULL atardı. Bunu deneyeceğim ve ne olacağını göreceğim. Ve gethostbyname() öğesinin aslında kötü bir ana bilgisayar adıyla atandığını ve kısa süre içinde size dönüp dönmediğini görmek için gdb'yi çalıştıracağım. – pandaEater

+0

no, büyük olasılıkla başlatılmamış belleğe (veya uygulamaya bağlı olarak '0.0.0.0') bir adrese bağlanmaya çalışacaktır. Wireshark'ın paketlerin dışarı çıkacağını ve yanıt vermeyeceğini gösterdiğinden şüpheliyim ve eğer yeterince beklersen, bağlantın sonunda zaman aşımı olur. –

cevap

2

Sen gethostbyname dönüş değeri kontrol edilmelidir için

teşekkürler. Başarısız olursa, mevcut programınız tanımlanmamış bir davranış sergiler, çünkü boş bir işaretçiyi kaldırırsınız.

+0

Oop, iyi yakalama, 'gethostbyname''nın' NULL''ı döndürdüğünü unutmuş. –

+0

Sadece yukarıdaki düzenlemede bulunan kodu şanssız olarak eklediniz. Baska öneri? – pandaEater

+0

@pandaEater: Söylemesi zor. 'StrHostName' adlı hatalı görev nedeniyle kodunuzu bile derleyemiyorum. –