2014-12-01 2 views
0

무언가 보내기에 관한 문제가 발생했습니다.C에서 부호없는 int에서 IP 주소 정보 설정

예를 들어 2 개의 서버가 있습니다.

unsigned int ip = 19216821; 
unsigned int port = 4000; 

char str[0]; 
sprintf(str, "%d", ip); 
if ((dest_he=gethostbyname(str)) == NULL) { // get the host info 
     herror("gethostbyname"); 
     exit(1); 
} 

dest_addr.sin_family = AF_INET; 
dest_addr.sin_port = htons(port); 
dest_addr.sin_addr = *((struct in_addr *)dest_he->h_addr); 
memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero); 

그때 내가

if(sendto(sockfd, &buffer, sizeof(buffer),0, (struct sockaddr *)&dest_addr ,sizeof(struct sockaddr_storage)) == -1){ 
     printf("error sending data\n"); 
     return -1; 
} 

을 dest_addr 내 버퍼를 보내려하지만 난 여전히 (..) == -1 sendto를 얻을 :

이 서버 1입니다.

내 다른 서버가 아직 답을 기다리는 중입니다. 서버 2 :

if(recvfrom(sockfd, &buffer, sizeof(buffer),0, (struct sockaddr *)&rand_addr ,&addr_size) == -1){ 
     printf("error receiving data"); 
     return -1; 
} 

나는 내 문제가 생각 나는 설정 dest_addr 잘못 또는?

+0

아마도'char str [0]'대신에 호스트 이름 문자열을위한 메모리를 할당하고 싶습니까? 또한 IPv4 주소 (192.168.2.1과 같은)를 검색하려면 문자열에 점을 포함해야합니다 (즉, '부호없는 int'표현을 변환하는 함수를 구현해야 함을 의미합니다. 'ip = (192 << 24) | 168 168 | (2 << 8) | 1 sprintf ("% d. % d. % d. % d", (ip >> 24) & 0xff, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff)'). – SleuthEye

+0

@SleuthEye OH NICE. 이제 대신 str 대신 gethostname에 "localhost"를 넣으면 작동합니다. 이 sprintf없이 정수로 int를 변환 할 수있는 방법이 있습니까? 나는 그것에 관해 무엇인가 발견 할 수 없었다. 그리고 str [0]은 어떻게 든 나를 괴롭 히고 있습니다. 내가 [0] 대신에 그것을 어떻게 동적으로 만들 수 있는지 알고 있습니까? 아니면 [0] 충분히 큰가요? – user3717963

+0

'unsigned int ip = 19216821;은 충분히 의미가있는 경우'192.168.2.1'을 저장하는 좋은 방법이 아닙니다. –

답변

1

우선, 귀하의 제목이 귀하의 설명과 실제로 일치하지 않습니다. 그럼에도 불구하고 나는 당신의 질문에 대답하기 위해 최선을 다할 것입니다.

기본적으로 사용자는 gethostbyname 기능을 올바르게 사용하지 않습니다. 이름에서 알 수 있듯이 이름으로 호스트를 가져 오지 않습니다. 따라서, 올바른 사용법은 다음과 같습니다

struct hostent *host = gethostbyname("localhost"); 

가 결과를 복사 할 struct 다음을 사용할 수 있습니다

memcpy(&dest_addr.sin_addr, host->h_addr_list[0], host->h_length); 

을 다른 한편으로는, 당신이 알고있는 IP-에게 메시지를 보내려면 사용할 수있는 주소 :

char *ip = "127.0.0.1" 
inet_aton(ip , &dest_addr.sin_addr) 

그 외 모든 것이 정상적으로 보입니다. TCP, UDP 또는 RAW 소켓을 사용하는 방법에 대한 온라인 예제가 많이 있습니다. 이것이 당신이 기대했던 대답 이었기를 바랍니다.