2012-01-18 9 views
5

無効なホスト名を渡したときに接続機能に問題があります。Unixソケットプログラミング、無効なホスト名でhang()を無効にする

#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()がハングします。有効なホスト名を指定すると、すべてが計画に従って動作します。有効なホスト名ですが無効なポートは0を返します。私の質問は、無効なホスト名を与えたときに-1を返さずにハングアップする理由ですか?任意のヘルプ

+2

あなたは 'gethostbyname'の戻り値をチェックしていないので、 –

+0

gethostbyname()funcがアドレスを見つけられない場合でも、接続しないと-1を返しますか?次にpHostInfoにNULLを割り当てます。私はそれを試して、何が起こるか見る。そして、gdbを使ってgethostbyname()が実際に悪いホスト名を割り当てていて、すぐにあなたに戻ってくるかどうかを調べます。 – pandaEater

+0

いいえ、おそらく、初期化されていないメモリ(実装によっては0.0.0.0)に接続しようとします。私はwiresharkがあなたにパケットが出て、応答がないことを示していると思っています。あなたが十分に長く待っていると、結局はタイムアウトになります。 –

答えて

2

あなたはgethostbynameからの戻り値をチェックする必要があるため

感謝。失敗した場合は、ヌルポインターを逆参照しているため、現在のプログラムは未定義の動作を示します。

+0

Oop、良いキャッチ、 'gethostbyname'が' NULL'を返したのを忘れました。 –

+0

上記の編集でコードを追加しました。助言がありますか? – pandaEater

+0

@pandaEater:わかりにくい。 'strHostName'への誤った割り当てのためにあなたのコードをコンパイルすることすらできません。 –

関連する問題