無効なホスト名を渡したときに接続機能に問題があります。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を返さずにハングアップする理由ですか?任意のヘルプ
あなたは 'gethostbyname'の戻り値をチェックしていないので、 –
gethostbyname()funcがアドレスを見つけられない場合でも、接続しないと-1を返しますか?次にpHostInfoにNULLを割り当てます。私はそれを試して、何が起こるか見る。そして、gdbを使ってgethostbyname()が実際に悪いホスト名を割り当てていて、すぐにあなたに戻ってくるかどうかを調べます。 – pandaEater
いいえ、おそらく、初期化されていないメモリ(実装によっては0.0.0.0)に接続しようとします。私はwiresharkがあなたにパケットが出て、応答がないことを示していると思っています。あなたが十分に長く待っていると、結局はタイムアウトになります。 –