2012-01-18 4 views
5

जब मैं एक अवैध होस्ट नाम पास करता हूं तो कनेक्ट फ़ंक्शन के साथ मुझे एक लटकती समस्या है।सी यूनिक्स सॉकेट प्रोग्रामिंग, कनेक्ट() को अमान्य होस्ट नाम पर लटकाना

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

कनेक्ट() लटक रहा है अगर मैं एक अवैध होस्ट नाम को तर्क के रूप में देता हूं। यदि मैं वैध होस्ट नाम देता हूं तो सब कुछ योजना के अनुसार काम करता है। एक वैध होस्ट नाम लेकिन अमान्य बंदरगाह वापस लौटने के लिए जाएगा। मेरा सवाल यह है कि, क्यों यह लटक रहा है और वापस नहीं आ रहा है -1 जब मैं एक अवैध होस्ट नाम देता हूं?

किसी भी मदद

+2

क्योंकि आप 'gethostbyname' के वापसी मूल्य की जांच नहीं कर रहे हैं? –

+0

अभी भी वापसी -1 से कनेक्ट नहीं होना चाहिए यदि gethostbyname() func को पता नहीं मिला है? जो तब PHostInfo को NULL असाइन करेगा। मैं कोशिश करूँगा और देखें कि क्या होता है। और मैं यह देखने के लिए gdb के माध्यम से चलाऊंगा कि gethostbyname() वास्तव में खराब होस्ट नाम के साथ असाइन कर रहा है और जल्द ही आपको वापस ले जाएगा। – pandaEater

+0

नहीं, यह शायद उस पते से कनेक्ट करने का प्रयास करेगा जो कार्यान्वयन के आधार पर अनियमित स्मृति (या शायद '0.0.0.0') है। मुझे संदेह है कि वायरशर्क आपको पैकेट दिखाएगा और कोई जवाब नहीं देगा और यदि आप काफी देर तक इंतजार करेंगे, तो आपका कनेक्ट अंततः टाइमआउट होगा। –

उत्तर

2

आप gethostbyname से वापसी मान की जाँच की जानी चाहिए के लिए धन्यवाद। यदि यह विफल हो जाता है, तो आपका वर्तमान प्रोग्राम अपरिभाषित व्यवहार प्रदर्शित करता है क्योंकि आप एक शून्य सूचक को संदर्भित कर रहे हैं।

+0

ओओप, अच्छी पकड़, भूल गया कि 'gethostbyname' 'NULL' लौटा। –

+0

बस कोई भाग्य के साथ उपरोक्त संपादन में कोड जोड़ा गया। कोई सुझाव? – pandaEater

+0

@ पांडाएटर: बताना मुश्किल है। मैं 'strHostName' के गलत असाइनमेंट के कारण भी आपका कोड संकलित नहीं कर सकता। –

संबंधित मुद्दे