2013-06-14 5 views
2

stringcanonical name 또는 IP address 인 경우 어떻게 알 수 있습니까?정식 이름 또는 IP 주소 - 소켓, 리눅스 및 C

argv[1]IP address 경우 내가 할 때문에 :

sscanf(argv[2],"%" SCNu16,&server_port); 
inet_aton(argv[1],&server_address); 

remote_address.sin_family = AF_INET; 
remote_address.sin_port = htons(server_port); 
remote_address.sin_addr = server_address; 

그리고는 argv [1]을 canonical name 경우 내가 할 : 나는 자리에 있어야하는 일 또한

h = gethostbyname(server); 

indirizzo_remoto.sin_family = AF_INET; 
indirizzo_remoto.sin_port = htons(porta_server); 
indirizzo_remoto.sin_addr = XYZ; 

을, XYZ?

가능한 해결책 :

struct in_addr indirizzo_server; 
struct hostent *h; 

h = gethostbyname(server); 

inet_aton(h->h_addr_list[0],&indirizzo_server); 

indirizzo_remoto.sin_family = AF_INET; 
indirizzo_remoto.sin_port = htons(porta_server); 
indirizzo_remoto.sin_addr = indirizzo_server; 
+0

모든 숫자와 마침표가 맞는지 확인하십시오. [0-255]. [0-255]. [0-255]. [0-255]. 비 숫자/비 기간이있는 경우 호스트 이름 일 가능성이 큽니다. –

+1

getaddrinfo()가 호스트 문자열 또는 IP 주소 문자열과 함께 작동하지 않습니까? – Bert

+0

숫자를 확인하는 경우 문자열을 정수 값으로 변환해야합니다. 일부 정식 이름은 올바른 IP가 아니더라도이 범위에 있습니다. – Magn3s1um

답변

3

getaddrinfo(3)에 익숙 중 하나를 수행하고, 또한 IPv6를 지원 할 수 받기.

1

이유는 무엇입니까? gethostbyname이 이미 처리합니다. 에 따옴표 manual :

[...] 이름 또는 결장의 IPv6 주소 (inet_addr은 (3) 용 등) 호스트 또는 표준 점 표기법의 IPv4 주소입니다 (및 도트) 표기법.

inet_aton으로 특수 처리를 삭제하고 완료하십시오. XYZ 부분에 대해서는

:

  • IPv4 또는 IPv6를 나타낼 수있는 h_addrtype 다음 hostent 구조는 in_addr에 복사해야 두 가지가 포함되어 있습니다. sin_family에 복사하십시오.
  • 실제 주소는 h_add_list입니다. 이것을 과 길이가 h_length으로 주어진 sin_addr에 복사하십시오.

이렇게하면 IPv4와 IPv6을 자동으로 처리해야합니다.

+0

그래서, 이렇게 할 수 있습니다 : struct in_addr indirizzo_server; struct hostent * h; h = gethostbyname (서버); inet_aton (h-> h_addr_list [0], & indirizzo_server); indirizzo_remoto.sin_family = AF_INET; indirizzo_remoto.sin_port = htons (porta_server); indirizzo_remoto.sin_addr = indirizzo_server; 나는 지금 노력한다! 감사합니다! – user2467899

+0

미안하지만 형식이 지정되지 않은 것 같습니다. 제 질문을 편집하면 더 잘 읽을 수 있습니다. 내 질문에 "가능한 해결책"절을보십시오. – user2467899

+0

@ user2467899 : 내 수정 사항을 확인하십시오. –