๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ดํ•ด

by eazuooz 2022. 7. 27.

๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ํ˜ธ์ŠคํŠธ๋“ค์ด ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋Œ€์ƒ์ด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

์†Œํ”„ํŠธ์›จ์–ด ์ฐจ์›์—์„œ ํ˜ธ์ŠคํŠธ๋“ค๊ฐ„์— ์—ฐ๊ฒฐ์„ ํ•ด์ฃผ๋Š” ์žฅ์น˜๊ฐ€ ํ•„์š”ํ•  ๋ฟ์ด๋‹ค.

๋ผ์šฐํ„ฐ๋Š” ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ ๊ฐ„์— ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ์ „์†กํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์žฅ์น˜๋‹ค. ํŒจํ‚ท์˜ ์œ„์น˜๋ฅผ ์ถ”์ถœํ•˜์—ฌ, ๊ทธ ์œ„์น˜์— ๋Œ€ํ•œ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ๋‹ค์Œ ์žฅ์น˜๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ•ด์ฃผ๋Š” ์žฅ์น˜๋ฅผ ์†Œ์ผ“(Socket)์ด๋ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ์šฉ์–ด์™€ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๋Š” ์šฉ์–ด๋Š” ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ ๋˜๊ณ  ์žˆ๋‹ค. 

 

์†Œ์ผ“์ด๋ž€ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๋‘๊ฐœ์˜ ํ˜ธ์ŠคํŠธ(host) ๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ๋งค๊ฐœ์ฒด ์—ญํ• ์„ ํ•œ๋‹ค.

 

ํ”„๋กœํ† ์ฝœ์˜ ์ •์˜

๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์“ฐ๋˜ ๊ฐ„์—, ๊ทธ ๋ฐฉ๋ฒ•๋งŒํผ์€ ์ƒํ˜ธ๊ฐ„์— ๋ฐ˜๋“œ์‹œ ์ผ์น˜ ํ•ด์•ผ ํ•œ๋‹ค.

ํ•œ์‚ฌ๋žŒ์€ ์ „ํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•œ์‚ฌ๋žŒ์€ ํŽธ์ง€๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜๋Š” ์—†๋Š”๊ฒƒ์ฒ˜๋Ÿผ

์„œ๋กœ๊ฐ„์˜ ๊ทœ์•ฝ์ด ํ•„์š”ํ•˜๋‹ค ์ฆ‰  ํ”„๋กœํ† ์ฝœ์ด๋ž€ '์ปดํ“จํ„ฐ ์ƒํ˜ธ๊ฐ„์˜ ๋Œ€ํ™”์— ํ•„์š”ํ•œ ํ†ต์‹  ๊ทœ์•ฝ'

 

์œˆ๋„์šฐ ๊ธฐ๋ฐ˜ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉฐ ๊ณต๋ถ€ํ•ด๋ณด์ž.

tcp/ip server

#include <iostream>
#include <stdlib.h>
#include <winsock2.h>
#include <WS2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

void ErrorHandling(const char* message);

int main(int argc, char* argv[])
{
	WSADATA	wsaData;
	SOCKET hServSock, hClntSock;
	SOCKADDR_IN servAddr, clntAddr;

	int szClntAddr;
	char message[] = "Hello World!";

	if (argc != 2)
	{
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error!");

	hServSock = socket(PF_INET, SOCK_STREAM, 0);
	if (hServSock == INVALID_SOCKET)
		ErrorHandling("socket() error");

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port = htons(atoi(argv[1]));

	if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
		ErrorHandling("bind() error");

	if (listen(hServSock, 5) == SOCKET_ERROR)
		ErrorHandling("listen() error");

	szClntAddr = sizeof(clntAddr);
	hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
	if (hClntSock == INVALID_SOCKET)
		ErrorHandling("accept() error");

	send(hClntSock, message, sizeof(message), 0);
	closesocket(hClntSock);
	closesocket(hServSock);
	WSACleanup();

	return 0;
}

void ErrorHandling(const char* message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

 

tcp/ip client

//#define _WINSOCK_DEPRECATED_NO_WARNINGS 

#include <iostream>
#include <stdlib.h>
#include <winsock2.h>
#include <WS2tcpip.h>


#pragma comment(lib, "ws2_32.lib")


void ErrorHandling(const char* message);

int main(int argc, char* argv[])
{
	WSADATA wsaData;
	SOCKET hSocket;
	SOCKADDR_IN servAddr;

	char message[30];
	int strLen;

	if (argc != 3)
	{
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error!");

	hSocket = socket(PF_INET, SOCK_STREAM, 0);
	if (hSocket == INVALID_SOCKET)
		ErrorHandling("socket() error");

	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	//servAddr.sin_addr.s_addr = inet_addr(argv[1]);
	servAddr.sin_port = htons(atoi(argv[2]));

	inet_pton(AF_INET, argv[1], &servAddr.sin_addr.s_addr);


	if (connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
		ErrorHandling("connect() error!");

	strLen = recv(hSocket, message, sizeof(message) - 1, 0);
	if (strLen == -1)
		ErrorHandling("read() error!");
	printf("Message from server: %s \n", message);

	closesocket(hSocket);
	WSACleanup();
	return 0;
}

void ErrorHandling(const char* message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

 

 ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ (protocol family) 

- Protocol ( ํ”„๋กœํ† ์ฝœ ) ์ด๋ž€ ๋””๋ฐ”์ด์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰, ๊ฐ ๋””๋ฐ”์ด์Šค ๊ฐ„ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ์ •์˜ํ•ด ๋†“์€ ์•ฝ์†์„ ๋œปํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์•ฝ์„ ์ •ํ•ด ๋†“์ง€ ์•Š์œผ๋ฉด ์ƒ๋Œ€๊ฐ€ ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์†Œ์ผ“ ํ†ต์‹ ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ๋ถ€๋ฅ˜๊ฐ€ ๋ช‡๊ฐ€์ง€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ฅ˜๋ฅผ ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„๋ผ๊ณ  ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ถ€๋ฅ˜๋ฅผ ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„๋ผ๊ณ ํ•˜๋ฉฐ c ์–ธ์–ด์—์„œ socket์„ ์ƒ์„ฑํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์ฒซ๋ฒˆ์งธ ์ธ์ž์— ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„๋ฅผ ๋„ฃ๋Š”๋‹ค.

 

// C code

#include <sys/socket.h>
int socket(PF_INET, int type, int protocol );

 

   ์ด๋ฆ„    Protocol Family ( ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ ) 
   PF_INET    IPv4 ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ 
   PF_INET6    IPv6 ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ 
   PF_LOCAL    ๋กœ์ปฌ ํ†ต์‹ ์„ ์œ„ํ•œ UNIX ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ 
   PF_PACKET     Low Level ์†Œ์ผ“์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ 
   PF_IPX     IPX ๋…ธ๋ฒจ ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ 

 

 ์†Œ์ผ“ ํƒ€์ž… ( TCP, UDP )

- socket type์€ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ์‹์„ ์˜๋ฏธ ํ•˜๋ฉฐ socket ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ 2๋ฒˆ์งธ ์ธ์ž์— ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

// C code

#include <sys/socket.h>
int socket(int domain, SOCK_DGRAM, int protocol);
# Python code

serverSocket = socket(AF_IENT, SOCK_STREAM)

 

   TCP    UDP
   ์—ฐ๊ฒฐ ์ง€ํ–ฅํ˜• ์†Œ์ผ“ ( 3-way handshake )    ๋น„ ์—ฐ๊ฒฐ ์ง€ํ–ฅํ˜• ์†Œ์ผ“
   SOCK_STREAM    SOCK_DGRAM
   ๋ฐ์ดํ„ฐ ์†์‹ค ์—†์ด ๋ชฉ์ ์ง€๋กœ ์ „์†ก    ๋ฐ์ดํ„ฐ ์†์‹ค์˜ ์šฐ๋ ค๊ฐ€ ์žˆ์Œ
   ์ „์†ก ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์‹     ์ „์†ก๋œ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ๊ฐ€์žฅ ๋น ๋ฅธ ์ „์†ก์„ ์ง€ํ–ฅ
   ๋ฐ์ดํ„ฐ ๊ฒฝ๊ณ„๊ฐ€ ์—†์Œ    ๋ฐ์ดํ„ฐ ๊ฒฝ๊ณ„ ์žˆ์Œ

 

 

IP์ฃผ์†Œ๋ž€?

์ธํ„ฐ๋„ท์ƒ์— ์กด์žฌํ•˜๋Š” ํ˜ธ์ŠคํŠธ๋“ค์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ 32๋น„ํŠธ ์ฃผ์†Œ ์ณฌ๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

4๋ฐ”์ดํŠธ ip ์ฃผ์†Œ๋Š” ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์™€ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ๋กœ ๋‚˜๋‰˜๋ฉฐ, ์ฃผ์†Œ์˜ ํ˜•ํƒœ์˜ ๋”ฐ๋ผ A,B,C,D,E ํด๋ž˜์Šค๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ž€?

๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฃผ๋Š” ID๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ B.COM์ด๋ผ๋Š” ํšŒ์‚ฌ์˜ ๋ฌด ๋Œ€๋ฆฌ์—๊ฒŒ ์ „์†กํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด ํšŒ์‚ฌ๋Š” ํ•˜๋‚˜์˜ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํšŒ์‚ฌ์˜ ๋ฌด ๋Œ€๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ผ๋‹จ์€ B.COM์˜ ๋„คํŠธ์›Œํฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์šฐ์„ ์ด๋‹ค. ์ฆ‰ ์ฒ˜์Œ๋ถ€ํ„ฐ IP์ฃผ์†Œ 4๋ฐ”์ดํŠธ ๋ชจ๋‘๋ฅผ ์ฐธ์กฐํ•ด์„œ ๋ฌด ๋Œ€๋ฆฌ์˜ ์ปดํ“จํ„ฐ๋กœ ๋ฐ”๋กœ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, 4๋ฐ”์ดํŠธ IP์ฃผ์†Œ์ค‘์—์„œ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋งŒ์„ ์ฐธ์กฐํ•ด์„œ ์ผ๋‹จ B.COM์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๋จผ์ € ์ฐพ์•„๊ฐ„๋‹ค.

 

Port๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์‹œ์— ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค. ๊ฐœ์ธ์ด ์‚ฌ์šฉํ•˜๋Š” IP๋Š” ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ์ ์ธ ์žฅ์น˜ (๋„คํŠธ์›Œํฌ ์นด๋“œ)๋ฅผ ํ†ตํ•ด์„œ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. IP์ฃผ์†Œ๋กœ๋Š” ์ธํ„ฐ๋„ท์ด ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ปดํ“จํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ค„ ์ˆ˜๋Š” ์žˆ์–ด๋„ ์ปดํ“จํ„ฐ์•ˆ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฃผ์ง€๋Š” ๋ชปํ•œ๋‹ค.

์ด๊ฒƒ์„ ๊ตฌ๋ถ„์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ PORT ๋‹ค. port๋Š” 2๋ฐ”์ดํŠธ๋กœ ํ‘œํ˜„๋˜๋ฏ€๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ 0 ~ 65535 ๊นŒ์ง€๋‹ค.

TCP์†Œ์ผ“๊ณผ  UDP ์†Œ์ผ“์€ port๋ฅผ ์„œ๋กœ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ค‘๋ณต๋˜์–ด๋„ ์ƒ๊ด€์—†๋‹ค.

์ฃผ์†Œ ์ •๋ณด์˜ ํ‘œํ˜„

Ipv4 (32 bit) Ipv6 (128 bit) ์ฃผ์†Œ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

typedef struct sockaddr_in 
{
#if(_WIN32_WINNT < 0x0600)
    short   sin_family; //์ฃผ์†Œ ์ฒด๊ณ„(address faimily)
#else //(_WIN32_WINNT < 0x0600)
    ADDRESS_FAMILY sin_family;
#endif //(_WIN32_WINNT < 0x0600)

    USHORT sin_port;	//16bit tcp/udp port
    IN_ADDR sin_addr;	//32bit ipv4 ์ฃผ์†Œ
    CHAR sin_zero[8];	//์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
} SOCKADDR_IN, *PSOCKADDR_IN;

#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion

typedef struct in_addr // 32bit ipv4 ์ฃผ์†Œ
{
        union 
        {
                struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { USHORT s_w1,s_w2; } S_un_w;
                ULONG S_addr;
        } S_un;
#define s_addr  S_un.S_addr /* can be used for most tcp & ip code */
#define s_host  S_un.S_un_b.s_b2    // host on imp
#define s_net   S_un.S_un_b.s_b1    // network
#define s_imp   S_un.S_un_w.s_w2    // imp
#define s_impno S_un.S_un_b.s_b4    // imp #
#define s_lh    S_un.S_un_b.s_b3    // logical host
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

 

๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ

sockaddr_in ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ(Network Byte Ordering)๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ์— ๋Œ€์ž…ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ผ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€?

 

๋ฐ”์ดํŠธ ์ˆœ์„œ๋ผ๋Š” ๊ฒƒ์€ ์‹œ์Šคํ…œ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

ํฌ๊ฒŒ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ Big-Edian, Little-Edian ๋ฐฉ์‹์ด๋‹ค.

์‹œ์Šคํ…œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ Big-Edian ๋ฐฉ์‹์„ ์“ฐ๋А๋ƒ Little-Edian ๋ฐฉ์‹์„ ์“ฐ๋А๋ƒ๋Š” CPU์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง„๋‹ค. ์ด๋ฅผ 'ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ(host byte order)'๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ๊ฐ€ ์ผ์ •์น˜ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ†ต์ผ๋œ ๋ฐฉ์‹์ธ '๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ(network byte order)'์ด๋‹ค.

ํ•จ์ˆ˜ ๊ตฌ๋ถ„ ์„ค๋ช…
uint32_t htonl(uint32_t hostlong) long ํ˜• ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๊ฐ’ ๊ตฌํ•จ
uint16_t htons(uint16_t hostshort) short ํ˜• ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๊ฐ’ ๊ตฌํ•จ
uint32_t ntohl(uint32_t netlong) long ํ˜• ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋ฐ์ดํ„ฐ ๊ฐ’ ๊ตฌํ•จ
uint16_t ntohs(uint16_t netshort) short ํ˜• ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ ๋ฐ์ดํ„ฐ ๊ฐ’ ๊ตฌํ•จ

ntohs() ๋Š” ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ฅผ ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ๋ฐ”๊พธ์–ด ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

์ฃผ์†Œ ์ •๋ณด ํ• ๋‹นํ•˜๊ธฐ

์†Œ์ผ“์— ์ฃผ์†Œ, ํ”„๋กœํ† ์ฝœ, ํฌํŠธ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. 

int bind ( SOCKET s, const struct sockaddr *name, int namelen );

 

  • s : socket()์œผ๋กœ ์ƒ์„ฑ๋œ ์†Œ์ผ“๊ฐ์ฒด
  • name : ์†Œ์ผ“๊ฐ์ฒด์— ๋ถ€์—ฌํ•  ์ฃผ์†Œ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๊ตฌ์กฐ์ฒด
  • namelen : name์˜ ๋ฐ์ดํ„ฐ ๊ธธ์ด. byte(:12)๋‹จ์œ„

 

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ƒ์ˆ˜  (0) 2022.08.17
๋ณ€์ˆ˜ ๋ฐ ์œ ํ˜•  (0) 2022.08.17
ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ  (0) 2022.08.17
์ปดํŒŒ์ผ๋Ÿฌ  (0) 2022.08.17
Directx12 ์ดˆ๊ธฐํ™”  (0) 2022.07.25

๋Œ“๊ธ€