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
Çünkü gethostbyname öğesinin dönüş değerini kontrol etmiyor musunuz? –
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
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. –