728x90
문자열 정보를 네트워크 바이트 순서의 정수로 변환
- sockaddr_in 구조체에 ip와 port 정보를 담음
- 이 정보를 담는 과정에서 네트워크 바이트 순서를 맞춰줘야 함
- inet_addr : 문자열 IP 정보를 네트워크 바이트 오더 정수로 변환
int main(int argc, char *argv[])
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) {
printf("WSAStartup() error!");
}
char *addr="127.0.0.1";
unsigned long conv_addr=inet_addr(addr);
if(conv_addr==INADDR_NONE) {
printf("Error occured! \n");
}
else {
printf("네트워크 바이트 오더 정수 : %#lx \n", conv_addr);
}
WSACleanup();
return 0;
}
-> 잘못된 IP를 전달할 경우 INADDR_NONE 상수 반환
char *addr="127.0.0.256";
unsigned long conv_addr=inet_addr(addr);
- inet_aton : inet_addr과 같은 기능을 가지지만 결과를 받는 방법에 차이가 있음
-> inet_addr : 변환 결과를 반환값으로 받음
-> inet_aton : sockaddr_in의 멤버인 in_addr을 인자로 전달
int main(int argc, char *argv[])
{
char *addr="127.0.0.1";
struct sockaddr_in addr_inet;
if(!inet_aton(addr, &addr_inet.sin_addr)) {
printf("Error occured! \n");
}
else {
printf("Network ordered integer addr: %#x \n", addr_inet.sin_addr.s_addr);
}
return 0;
}
- inet_ntoa : sockaddr_in의 sin.addr에 저장된 정수형 ip정보를 문자형으로 변환
int main(int argc, char *argv[])
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) {
printf("WSAStartup() error!");
}
struct sockaddr_in addr;
char* str_arr;
addr.sin_addr.s_addr = htonl(0x1020304);
str_arr=inet_ntoa(addr.sin_addr);
printf("IP address = %s\n",str_arr);
WSACleanup();
return 0;
}
인터넷 주소의 초기화
- 전에 설명한 htons 함수와 inet_addr 함수를 이용해 sockaddr_in 구조체에 ip 정보와 포트 정보를 설정 후 bind로 전달
int main(int argc, char *argv[])
{
...
struct sockaddr_in addr;
char* serv_ip = "127.0.0.1";
char* serv_port = "8080";
memset(&addr, 0, sizeof(addr);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(serv_ip);
addr.sin_port=htons(atoi(serv_port));
bind(serv_sock, (struct sockaddr*)&addr, sizeof(addr);
...
}
윈도우 기반의 변환 함수
- WASStringToAddress : 문자열 ip주소와 포트번호를 전달하여 SOCKADDR 구조체에 설정
- WASAddressToString : SOCKADDR 구조체에 저장된 ip와 포트 정보를 문자열로 반환
int main(int argc, char *argv[])
{
char *strAddr="127.0.0.1:8080";
char strAddrBuf[50];
SOCKADDR_IN servAddr;
memset(strAddrBuf,0,sizeof(strAddrBuf));
memset(&servAddr,0,sizeof(servAddr));
int size = 0;
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
size=sizeof(servAddr);
WSAStringToAddress(strAddr, AF_INET, NULL, (SOCKADDR*)&servAddr, &size);
size=sizeof(strAddrBuf);
WSAAddressToString((SOCKADDR*)&servAddr, sizeof(servAddr), NULL, strAddrBuf, &size);
printf("변환 결과 : %s \n", strAddrBuf);
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 04-2. TCP 기반 서버와 클라이언트의 구현 (0) | 2021.02.14 |
---|---|
열혈 TCP/IP 04-1. TCP와 UDP에 대한 이해 (0) | 2021.02.14 |
열혈 TCP/IP 03-3. 네트워크 바이트 순서와 인터넷 주소 변환 (0) | 2021.02.05 |
열혈 TCP/IP 03-2. 주소정보의 표현 (0) | 2021.02.02 |
열혈 TCP/IP 03-1. 소켓에 할당되는 IP주소와 PORT번호 (0) | 2021.02.02 |