[Linux, C] IP주소와 도메인네임을 서로 치환하는 프로그램 TCP/IP통신Linux2020. 9. 7. 15:35
Table of Contents
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
int main(int argc, char **argv){
struct hostent *host;
struct sockaddr_in addr;
int i;
// 메모리 초기화
memset(&addr, '0', sizeof(addr));
// 인자 수 체크
if(argc!=2){
printf("Please, Input IP Address or Domain Name \n");
exit(1);
}
// 32비트 IPv4주소를 넣을 수있다. inet_addr()를 통해 32비트 변환
addr.sin_addr.s_addr=inet_addr(argv[1]);
// addr : inet_addr()한수를 이용해 변환된 IP주소가 전달되어있는 in_addr 구조체 변수 포인터
// lend : 입력되는 주소의 길이 IPv4=4 IPv6=16
// type : 입력되는 주소의 타입 AF_INET=IPv4 , AF_INET6=IPv6
host = gethostbyaddr((char*)&addr.sin_addr, 4, AF_INET);
if(host){
printf("DOMAIN NAME : %s \n\n", host->h_name);
} else {
host = gethostbyname(argv[1]);
if(host){
printf("IP ADDRESS TYPE : %s \n", host->h_addrtype==AF_INET?"IPv4":"IPv6");
printf("IP ADDRESS >>>> \n");
for(i=0; host->h_addr_list[i]; i++){
puts(inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
}
fputc('\n', stdout);
} else {
printf("Get Host Error\n");
}
}
return 0;
}
* 소켓주소구조체 : IP주소화 port번호는 구조체 변수에 담아서 표현한다.
struct sockaddr_in {
sa_family_t sa_family; // 주소체계
uint16_t sin_port; // 포트번호
struct in_addr sin_addr; // 32비트 주소
struct in_addr {
uint32_t s_addr;
}
//char sin_zero[8]; // 요즘 사용되지않음
};
struct hostent {
char *h_name; // 공식 도메인 네임
char **h_aliases; // 비공식 도메인 네임(별명)
int h_addrtype; // 주소 정보체계 (IPv4: AF_INET, IPv6: AF_INET6)
int h_length; // return IP정보의 크기 (IPv4 : 4, IPv6 : 6)
char **h_addr_list; // IP의 주소정보, 둘 이상의 경우 모두 반환
};
반응형
'Linux' 카테고리의 다른 글
[Linux,C] ls 명령어 만들기 (0) | 2020.10.15 |
---|---|
[Linux,C] 우분투 ifconfig설치, 에러 waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. 에러 해결 (0) | 2020.10.06 |
[Linux, C] cat명령어 만들기 (0) | 2020.10.01 |
[Linux, C] echo 서버 & 클라이언트 TCP/IP 통신 (0) | 2020.09.14 |
[Linux, C] Hello world 서버 & 클라이언트 TCP/IP통신, 소켓통신 (0) | 2020.09.14 |
@반나무 :: 반나무_뿌리
3년차 WPF 개발자입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!