E D R , A S I H C RSS

Unix Socket Programming And Windows Implementation

Ž˜ดง€˜ ปจ…ธ ๋ฅผ ๋ณด•„•˜๋‹ˆ, ๋”ฐ๋กœ Ž˜ดง€๋ฅผ ๋ฝ‘•„๋‚ด๋„ ๋ ๊ฒƒ ๊ฐ™•„ ๋ฌธ„œ๊ตฌกฐกฐ • •˜˜€Šต๋‹ˆ๋‹ค. ›๋ž˜ Ž˜ดง€ ด๋ฆ„€ ๋ฐ๋ธ”Šคบ ”„2005/Socket Programming in Unix/Windows Implementation˜€Šต๋‹ˆ๋‹ค. - ž„ธƒ

ฃผ œ : Socket Programming˜ ๊ธฐˆ ธ ๋ถ€๋ถ„„ •Œ•„๋ณธ๋‹ค.

Contents

1. ๊ธฐ๋ณธ ธ •จˆ˜/๊ฐœ๋…๋“ค
1.1. Socket
1.1.1. domain:
1.1.2. type: „œ๋น„Šค ƒ€ž…
1.1.3. protocol: ”„๋กœ† ฝœ
1.2.„Šธ›Œฌ  •๋ณด
1.2.1. sin_family: // ฃผ†Œฒด๊ณ„
1.2.2. sin_port:
1.2.3. sin_addr:
1.2.4. sin_zero:
2. Server ๊ฐ€ ๋  ”„๋กœ๊ทธ๋žจ— •„š”•œ •จˆ˜
2.1. Bind - socket๊ณผ ๋„Šธ›Œฌ  •๋ณด๋ฅผ —ฐ๊ฒฐ•˜๋Š” Bind!!!
2.2. listen - client˜ š”ฒญ„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค!
2.3. accpet - client˜ š”ฒญ„ ๋ฐ›•„๋“คธ๋‹ค!
3. Client ๊ฐ€ ๋  ”„๋กœ๊ทธ๋žจ— •„š”•œ •จˆ˜
3.1. connect - Server— —ฐ๊ฒฐ•œ๋‹ค.
4.  •๋ฆฌ— •„š”•œ •จˆ˜
4.1. close ŒŒผ„ ๋‹ซ๋Š”๋‹ค.
5. server/client ๊ณต†ต - ž…ถœ๋ ฅ •จˆ˜
5.1. send/write - ƒ๋Œ€—๊ฒŒ ๋ฐด„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค.
5.2. recv/read - ƒ๋Œ€—๊ฒŒ ๋ฐด„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค.
6. โ€ป œˆ๋„šฐ ๊ธฐ๋ฐ˜—„œ๋Š”...
7. server ˜ˆ œ
8. ‹คŠต
9. ฐธ๊ณ  ‚ฌดŠธ


1. ๊ธฐ๋ณธ ธ •จˆ˜/๊ฐœ๋…๋“ค

1.1. Socket

โ€ป †Œผ“ด๋ž€?

~cpp 
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
// „๊ณต ‹œ ŒŒผ ๋””Šคฌ๋ฆฝ„ฐ, ‹คŒจ ‹œ -1 ๋ฆฌ„

1.1.1. domain:

PF_INET : ธ„ฐ๋„”„๋กœ† ฝœ ฒด๊ณ„ ‚ฌšฉ

PF_INET6 IPv6 : ”„๋กœ† ฝœ ฒด๊ณ„ ‚ฌšฉ

PF_UNIX : œ ๋‹‰Šค ๋ฐฉ‹˜ ”„๋กœ† ฝœ ฒด๊ณ„ ‚ฌšฉ (”„๋กœ„Šค๊ฐ„ †ต‹ )

PF_NS XEROX : ๋„Šธ›Œฌ ‹œŠค…œ˜ ”„๋กœ† ฝœ ฒด๊ณ„ ‚ฌšฉ

PF๋Š” Protocol Family
PF๋Œ€‹  AF๋ฅผ ‚ฌšฉ•ด๋„ ๋ฌด๋ฐฉ. (ex. PF_INET -> AF_INET)

1.1.2. type: „œ๋น„Šค ƒ€ž…

โ€ป TCP/IP, UDP๋ž€?
SOCK_STREAM : ŠคŠธ๋ฆผ ๋ฐฉ‹˜ †Œผ“ ƒ„ (TCP/IP)

SOCK_DGRAM : ๋ฐด„ฐ๊ทธ๋žจ ๋ฐฉ‹˜ †Œผ“ ƒ„ (UDP)

SOCK_RAW : raw ๋ชจ๋“œ˜ †Œผ“ ƒ„

1.1.3. protocol: ”„๋กœ† ฝœ

IPPROTO_TCP : TCP ๊ธฐ๋ฐ˜. ๊ฐ’€ 0ด๋‹ค.

IPPROTO_UDP : UDP ๊ธฐ๋ฐ˜. ๊ฐ’€ 0ด๋‹ค.
// šฐ๋ฆฌ๊ฐ€ ‚ฌšฉ•˜๋Š” ”„๋กœ† ฝœธ TCP, UDP๊ฐ€ 0ด๋ฏ€๋กœ 0œผ๋กœ จ๋„ ๋ฌด๋ฐฉ•˜๋‹ค.
// ๊ตฌฒด ธ ”„๋กœ† ฝœ„ „ ƒ•  ๋•Œ ‚ฌšฉ•˜๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„˜ ‘šฉ ”„๋กœ๊ทธ๋ ˜—„œ๋Š” 0œผ๋กœ ง€ ••˜๋ฉด ๋œ๋‹ค.


~cpp 
˜ˆ œ)

main(){
int sockfd;

	sockfd = socket(AF_INET, SOCK_STREAM, 0);

	if(sockfd == -1)
		fprintf(stderr, "socket •จˆ˜—„œ —๋Ÿฌ"), exit(1);
	// —๋Ÿฌ๊ฐ€ ๋‚ฌ„๊ฒฝšฐ( sockfd == -1) —๋Ÿฌ๋ฅผ ถœ๋ ฅ•˜๊ณ  ”„๋กœ๊ทธ๋žจ ข…๋ฃŒ.
}

1.2. „Šธ›Œฌ  •๋ณด

~cpp 
struct sockaddr {

    u_short sa_family;    /* address family */

    char sa_data[14];    /* ฃผ†Œ(IP ฃผ†Œ + ฌŠธ ๋ฒˆ˜ธ) */

};


~cpp 
struct sockaddr_in {

short sin_family;			// ฃผ†Œ ฒด๊ณ„๋ฅผ ๋‚˜ƒ€๋‚ธ๋‹ค.

u_short sin_port;			// port ๋ฒˆ˜ธ

struct in_addr sin_addr;		// ip ฃผ†Œ

char sin_zero[8];			// “ฐง€ •Š๋Š” ฃผ†Œ

};

โ€ป ™œ sockaddr๊ณผ sockaddr_in˜ structure๊ฐ€ ๊ฐ™„๊นŒ?

1.2.1. sin_family: // ฃผ†Œฒด๊ณ„

AF_INET : ธ„ฐ๋„ฃผ†Œ ฒด๊ณ„

AF_UNIX : œ ๋‹‰Šค ŒŒผ ฃผ†Œ ฒด๊ณ„

AF_NS XEROX : ฃผ†Œ ฒด๊ณ„

// sockaddr_in € TCP/IPฒด œ ด๋ฏ€๋กœ AF_INET๋งŒ ‚ฌšฉ•œ๋‹ค. -> TCP/IP๋Š” ธ„ฐ๋„ท ๊ธฐ๋ฐ˜ด๋ฏ€๋กœ.
// AF_INET/PF_INET -> ธ„ฐ๋„”„๋กœ† ฝœ ฒด๊ณ„ ‚ฌšฉ.


~cpp 
๋ฐด„ฐ๋ฅผ Big-Endianœผ๋กœ ๋ณ€™˜ ‹œผœฃผ๋Š” ฒด๊ณ„.

unsigned short integer ๋ณ€™˜ (2๋ฐ”ดŠธ ฌ๊ธฐ)
  htons(): host-to-network ๋ฐ”ดŠธ ๋ณ€™˜ (Big-Endianœผ๋กœ ๋ณ€™˜)
  ntohs(): network-to-host ๋ฐ”ดŠธ ๋ณ€™˜ (•ด๋‹น ‹œŠค…œ)

unsigned long integer ๋ณ€™˜ (4๋ฐ”ดŠธ ฌ๊ธฐ)
  htonl(): host-to-network ๋ฐ”ดŠธ ๋ณ€™˜ (Big-Endianœผ๋กœ ๋ณ€™˜)
  ntohl(): network-to-host ๋ฐ”ดŠธ ๋ณ€™˜ (•ด๋‹น ‹œŠค…œ)

 โ€ป ™œ šฐ๋ฆฌ๋Š” ๋ฐด„ฐ๋ฅผ Big-Endianœผ๋กœ ๋ณ€™˜ ‹œผœฃผ–ด•ผ• ๊นŒ?
 โ€ป ๊ทธ๋ ‡๋‹ค๋ฉด šฐ๋ฆฌ๊ฐ€  „†ก•˜๋Š” ๋ฐด„ฐ ๋ชจ๋‘ Big-Endianœผ๋กœ ๋ณ€™˜ ‹œผœฃผ–ด•ผ• ๊นŒ?

1.2.2. sin_port:

NULL : ž„˜˜ ฌŠธ๋ฅผ • ๋‹น•œ๋‹ค. client—„œ ‚ฌšฉ•œ๋‹ค.
// u_short sin_port € Big-Endian„ ‚ฌšฉ•œ๋‹ค.
// ๋”ฐ๋ผ„œ Little_Endian„ ‚ฌšฉ•˜๋Š” ‹œŠค…œ—„œ๋Š” Big-Endianœผ๋กœ ๋ฐ”๊ฟ”ค˜•ผ•œ๋‹ค.

1.2.3. sin_addr:

INADDR_ANY : ž๊ธฐ ž‹ ˜ ฃผ†Œ๋ฅผ • ๋‹น•œ๋‹ค. (== 0)
// sin_addr€ ธ„ฐ๋„ฃผ†Œ๋ฅผ ๋‹ด๊ณ  žˆœผ๋ฏ€๋กœ 4 ๋ฐ”ดŠธ๊ฐ€ •„š”•˜๋‹ค.
cf. ๋„๋ฉ”ธ ๋„ž„„ †ต•œ —ฐ๊ฒฐ€ „ค๋ช…•˜ง€ •Š๊ฒ Šต๋‹ˆ๋‹ค.


~cpp 
struct in_addr {
	unsigned long s_addr;
};


~cpp 
/*
	inet_addr(): ฃผ†Œ๋ฅผ long˜•œผ๋กœ ๊ณ„‚ฐ•˜๊ณ  htonl()๋ฅผ ‚ฌšฉ•ด Big-Endianœผ๋กœ ๋ณ€™˜ ›„ ๊ฐ’„ return •œ๋‹ค.
		// 165.194.27.129 -> 165*256*256*256 + 194*256*256 + 27*256 + 129 = 2780961665
		// 2780961665 ˜ ๊ฐ’€ Little-Endian ฒด๊ณ„—„œ๋Š” 811BC2A5ด๋‹ค.
		// ด๊ฒƒ„ A5C21B81๋กœ ๋ฐ”๊ฟ”  €žฅ•œ๋‹ค.


˜ˆ œ )
	ina.sin_addr.s_addr = inet_addr("127.0.0.1");
*/

1.2.4. sin_zero''''''8'''''':

// sin_zero ๋ฐฐ—ด€ •ญƒ 0œผ๋กœ „›Œ ธ žˆ–ด•ผ•œ๋‹ค.

โ€ป ™œ sin_zero๊ฐ€ ๋งŒ๋“ค–ดกŒ„๊นŒš”?

~cpp 
˜ˆ œ)

#define PORT 9999
#define SERVER_IP "165.194.27.129"

main(){
struct sockaddr_in ina;

	memset((struct sockaddr *)&ina, 0, sizeof(struct sockaddr));
	// sin_zero๋ฅผ 0œผ๋กœ „šด๋‹ค.
	// bzero๋ผ๋Š” •จˆ˜๋„ žˆง€๋งŒ ˆ๊ธฐ— 0œผ๋กœ „šฐ๋Š” ๊ฒƒด Žธ•˜๋‹ค.
	// bzero(&(ina.sin_zero), 8);

	ina.sin_port = htons(PORT);			// PORT˜ ๊ฒฝšฐ  •ˆ˜๋ฅผ ๋„–ด•ผ•œ๋‹ค.

	ina.sin_addr.s_addr = inet_addr(SERVER_IP);	// ด๋ผด–ธŠธ˜ ๊ฒฝšฐ
							// SERVER_IP˜ ๊ฒฝšฐ ๋ฌธž—ด ฌธ„ฐ๋ฅผ ๋„–ด•ผ•œ๋‹ค.
		// 165.194.27.129 -> 165*256*256*256 + 194*256*256 + 27*256 + 129 = 2780961665 ๋กœ  €žฅด ๋œ๋‹ค.
	// ina.sin_addr.s_addr = INADDR_ANY;		// „œ๋ฒ„˜ ๊ฒฝšฐ
}

2. Server ๊ฐ€ ๋  ”„๋กœ๊ทธ๋žจ— •„š”•œ •จˆ˜



2.1. Bind - socket๊ณผ ๋„Šธ›Œฌ  •๋ณด๋ฅผ —ฐ๊ฒฐ•˜๋Š” Bind!!!

~cpp 
#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *myaddr, int addrlen);
// „๊ณต ‹œ 0, ‹คŒจ ‹œ -1 ๋ฆฌ„


~cpp 
˜ˆ œ)

	if( bind(sockfd, (struct sockaddr *)&ina, sizeof(struct sockaddr) == -1 )
		fprintf(stderr, "bind—„œ —๋Ÿฌ๊ฐ€ ๋‚ฌŠต๋‹ˆ๋‹ค.n")), exit(1);

2.2. listen - client˜ š”ฒญ„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค!

~cpp 
#include <sys/socket.h>

int listen(int sockfd, int backlog);
// „๊ณต ‹œ 0, ‹คŒจ ‹œ -1 ๋ฆฌ„ด

// backlog๋Š” „œ๋ฒ„—  ‘†•  ‚ฌ๋žŒ˜ ๋Œ€๊ธฐž Maximum„ ˜๋ฏธ•œ๋‹ค.


~cpp 
˜ˆ œ)

#deinfe BACKLOG 5		// ๋Œ€๊ธฐž๊ฐ€ 5๋ช…ด ๋„˜œผ๋ฉด  ‘† ๋ถˆ๊ฐ€๋Šฅ•˜๋‹ค.

	if( listen(sockfd, BACKLOG) == -1 )
		fprintf(stderr, "listen—„œ —๋Ÿฌ๊ฐ€ ๋‚ฌŠต๋‹ˆ๋‹ค.n"), exit(1);

2.3. accpet - client˜ š”ฒญ„ ๋ฐ›•„๋“คธ๋‹ค!

~cpp 
#include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, int *addrlen);
// „๊ณต ‹œ ŒŒผ ๋””Šคฌ๋ฆฝ„ฐ, ‹คŒจ ‹œ -1 ๋ฆฌ„ด
// *addrlen— ฃผ˜. accept๋Š” client˜ ธ„ฐ๋„ •๋ณด๊ฐ€ ๋“ค–ด˜ค๋ฉด addrlen˜ ฌ๊ธฐ(struct sockaddr_in˜ ฌ๊ธฐ)™€
// ๋น„๊ต๋ฅผ •˜—ฌ ฌ๋‹ค๋ฉด ๋ฐ›•„๋“คดง€ •Š๊ณ , ž‘๋‹ค๋ฉด ฌ๊ธฐ๋ฅผ „ผ๊ฒƒด๋‹ค.
// child process๋ฅผ ƒ„•ด ๋‹คค‘ —ฐ๊ฒฐ„ •˜๋Š” ๊ฒƒ€ „ค๋ช…•˜ง€ •ŠŠต๋‹ˆ๋‹ค.


~cpp 
˜ˆ œ )

// int server_sock, client_sock
// struct sockaddr_in server_addr, client_sock

int sizeof_sockaddr_in;

	sizeof_sockaddr_in = sizeof(struct sockaddr_in);

	client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &sizeof_sockaddr_in);

	if( client_sock == -1 )
		fprintf(stderr, "accept—๋Ÿฌ. client๊ฐ€ „œ๋ฒ„—  ‘† •  ˆ˜ —†Šต๋‹ˆ๋‹ค.");

3. Client ๊ฐ€ ๋  ”„๋กœ๊ทธ๋žจ— •„š”•œ •จˆ˜



3.1. connect - Server— —ฐ๊ฒฐ•œ๋‹ค.

โ€ป connect™€ server •จˆ˜ค‘ –ด๋– •œ •จˆ˜๊ฐ€ ๋‹ฎ•˜๋Š”ง€ ด•ผ๊ธฐ •ด๋ณดž.
โ€ป ด๋ฅผ ด•ผ๊ธฐ •ด๋ณด๊ณ  client˜ ”„๋กœ๊ทธ๋žจ˜ ๋„Šธ›Œฌ  •๋ณด(struct sockaddr_in)—๋Š” ๋ฌด—‡ด ๋“ค–ด๊ฐ€•ผ•˜๋Š”ง€ ด•ผ๊ธฐ•ด๋ณดž.

~cpp 
#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
// „๊ณต ‹œ 0, ‹คŒจ ‹œ -1 ๋ฆฌ„


~cpp 
˜ˆ œ )

	if( connect(client_sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1 )
		fprintf(stderr, "„œ๋ฒ„— connect •  ˆ˜ —†Šต๋‹ˆ๋‹ค."), exit(1);

4.  •๋ฆฌ— •„š”•œ •จˆ˜


4.1. close ŒŒผ„ ๋‹ซ๋Š”๋‹ค.

~cpp 
#include <unistd.h>

int close(int fildes);

// „๊ณต ‹œ 0, ‹คŒจ ‹œ -1 ๋ฆฌ„


~cpp 
˜ˆ œ )

	close(sockfd);

5. server/client ๊ณต†ต - ž…ถœ๋ ฅ •จˆ˜



5.1. send/write - ƒ๋Œ€—๊ฒŒ ๋ฐด„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค.

~cpp 
#include <unistd.h>

ssize_t send(int fildes, const void * buf, size_t nbytes, unsigned int flags);
ssize_t write(int fildes, const void * buf, size_t nbytes);

// „๊ณต ‹œ  „๋‹ฌ •œ ๋ฐ”ดŠธ ˆ˜, ‹คŒจ ‹œ -1 ๋ฆฌ„


~cpp 
˜ˆ œ )

char buf1[] = "Hello, World!";
char *buf2 = "Hello, World!";

	if( send(client_sock, buf1, sizeof(buf), 0) == -1 )
		fprintf(stderr, "send error");

	if( write(client_sock, buf2, strlen(buf2)) == -1 )
		fprintf(stderr, "write error");

// ƒ€ ‹œŠค…œœผ๋กœ ด‹„ œ„•ด ๋˜๋„๋ก send๋ฅผ ‚ฌšฉ•˜๋Š” ๊ฒƒด ข‹๋‹ค.

5.2. recv/read - ƒ๋Œ€—๊ฒŒ ๋ฐด„ฐ๋ฅผ ๋ฐ›๋Š”๋‹ค.

~cpp 
#include <unistd.h>

ssize_t recv(int fildes, void *buf, size_t nbytes, unsigned int flags);
ssize_t read(int fildes, void *buf, size_t nbytes);

// „๊ณต ‹œ ˆ˜‹  •œ ๋ฐ”ดŠธ ˆ˜(๋‹จ EOF๋งŒ๋‚˜๋ฉด 0), ‹คŒจ ‹œ -1 ๋ฆฌ„


~cpp 
˜ˆ œ )

char buf1[200];
char buf2[200];
int str_len;

	str_len = recv(sockfd, buf1, sizeof(buf1), 0);
	str_len = read(sockfd, buf2, sizeof(buf2));

	buf1[str_len] = 0;			// ๋ฐฐ—ด˜ ๋„ „ ••ดค€๋‹ค. •˜ง€ •Šœผ๋ฉด ๋’ค˜ “ฐ๋ ˆ๊ธฐ ๊ฐ’๊นŒง€  ‘๊ทผ๋œ๋‹ค.
	buf1[str_len] = 0;

// ƒ€ ‹œŠค…œœผ๋กœ ด‹„ œ„•ด ๋˜๋„๋ก send๋ฅผ ‚ฌšฉ•˜๋Š” ๊ฒƒด ข‹๋‹ค.

6. โ€ป œˆ๋„šฐ ๊ธฐ๋ฐ˜—„œ๋Š”...

~cpp 
โ—Ž Visual C++—„œ ๋นˆ †ŒŠค ŒŒผ •˜๋‚˜๋ฅผ —ฐ๋‹ค.
Project -> Setting -> LINK ๋ฉ”๋‰ด -> Object/library modules: ˜ ๋๋ถ€๋ถ„— ws2_32.lib ๋ฅผ ถ”๊ฐ€•œ๋‹ค.


โ—Ž #include <sys/socket.h>		->	#include <winsock2.h>

โ—Ž UNIX ฒด๊ณ„—„œ ‚ฌšฉ•˜๋˜ •จˆ˜๋“ค˜ —ค๋”ŒŒผด Windows ๊ธฐ๋ฐ˜—„œ๋Š” กดžฌ•˜ง€ •Š„ ˆ˜๋„ žˆ๋‹ค.

โ—Ž struct sockaddr_in		->	SOCKADDR_IN

โ—Ž int sockfd;			->	SOCKET sockfd;
// †Œผ“ ๋””Šคฌ๋ฆฝ„ฐ			// †Œผ“ •ธ๋“ค


โ—Ž main() •จˆ˜ ๋‚ด๋ถ€—

WSADATA wsaDATA;		// ถ”๊ฐ€. WSADATA˜•˜ ๋ณ€ˆ˜๋ฅผ „ –ธ•œ๋‹ค.

if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
	fprintf(stderr, "WSAStartup Error"), exit(1);
				// ถ”๊ฐ€. WSAStartup() € socket˜ ๋ฒ„ ผ„ ws2_32 ๋ผด๋ธŒ๋Ÿฌ๋ฆฌ—  „๋‹ฌ•œ๋‹ค.
// ”„๋กœ๊ทธ๋žจด ๋๋‚  ๋•Œ, •ญƒ WSACleanup()œผ๋กœ ๋ฆฌ†ŒŠค๋ฅผ •ด œ•ด•ผ•œ๋‹ค.


~cpp 
˜ˆ œ)

#include <winsock2.h>

main(){
WSADATA wsaDATA;

SOCKET sockfd;
// UNIX ๊ธฐ๋ฐ˜˜ int sockfd;
SOCKADDR_IN ina;
// UNIX ๊ธฐ๋ฐ˜˜ struct sockaddr_in ina;

if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
	fprintf(stderr, "WSAStartup Error"), exit(1);

... ๋‚ดšฉ

WSACleanup();

}

7. server ˜ˆ œ



~cpp 
#include <stdio.h>
#include <winsock2.h>

#define PORT 9999		// „œ๋ฒ„˜ 9999๋ฒˆ ฌŠธ๋ฅผ —ฐ๋‹ค
#define BACKLOG 5

void error(char *buf)
{
	puts(buf), exit(1);
}

main(){
WSADATA wsaData;

SOCKET server_sock;		// „œ๋ฒ„˜ socket„ ƒ„
SOCKET client_sock;		// ด๋ผด–ธŠธ˜ socket„ ƒ„

SOCKADDR_IN server_addr;	// ๋„Šธ›Œฌ˜  •๋ณด๋ฅผ ๋‹ด„ structure ƒ„.
SOCKADDR_IN client_addr;

int sizeof_sockaddr_in;
char msg[] = "Hello, World!";

	if( WSAStartup(MAKEWORD(2,2), &wsaData) == -1 )
		error("WSAStartup Error");


// socket „ •
// ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ด๊ฒƒ„ †ต•ด ๋„Šธ›Œฌ™€ ๋Œ€™”๋ฅผ •œ๋‹ค.

	server_sock = socket(AF_INET, SOCK_STREAM, 0);
	if( server_sock == -1 )
		error("server socket error");


// ๋„Šธ›  •๋ณด „ •
// ด๊ฒƒ€ ”„๋กœ๊ทธ๋žจด socket๊ณผ —ฐ๊ฒฐ•   •๋ณด๋ฅผ ๋‹ด๊ณ žˆ๋‹ค.

	memset((SOCKADDR_IN *)&server_addr, 0, sizeof(SOCKADDR_IN));
	// struct sockaddr_in	->	SOCKADDR_IN
	server_addr.sin_family = AF_INET;
	server_addr.sin_addr.s_addr = INADDR_ANY;	// ž‹ ˜ ฃผ†Œ๋กœ „ ••œ๋‹ค.
	server_addr.sin_port = htons(PORT);


// socket๊ณผ ๋„Šธ›  •๋ณด๋ฅผ bind()๋กœ —ฐ๊ฒฐ•œ๋‹ค.

	if( bind(server_sock, (sockaddr *)&server_addr, sizeof(SOCKADDR_IN)) == -1 )
		error("bind() —๋Ÿฌ");


// ค€๋น„๋Š” ๋๋‚ฌ๋‹ค!
// listen()œผ๋กœ client˜ —ฐ๊ฒฐ š”ฒญ„ ๊ธฐ๋‹ค๋ฆฌž.
// client˜ š”ฒญด ˜ฌ ๋•Œ ๊นŒง€ „œ๋ฒ„๋Š” —ฌ๊ธฐ„œ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

	if( listen(server_sock, BACKLOG) == -1 )
		error("listen() —๋Ÿฌ");


// client˜ š”ฒญด ˜ค๋ฉด server๋Š” accept() •จˆ˜๋กœ š”ฒญ„ ๋ฐ›•„๋“คธ๋‹ค.
// client™€˜ ๋ฐด„ „†ก„ œ„•ด client †Œผ“ ๋””Šคฌ๋ฆฝ„ฐ๊ฐ€ •„š”•˜๋‹ค.

	sizeof_sockaddr_in = sizeof(SOCKADDR_IN);

	while(1)
	{
		client_sock = accept(server_sock, (sockaddr *)&client_addr, &sizeof_sockaddr_in);
		if( client_sock == -1 )
		{
			// accept๊ฐ€ ‹คŒจ•˜๋ฉด while˜ ฒ˜Œœผ๋กœ ๋Œ•„๊ฐ€ ๋‹ค‹œ client๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
			fprintf(stderr, "accept() —๋Ÿฌ");
			continue;
		}

		send(client_sock, msg, sizeof(msg), 0);

		//close(client_sock);
		WSACleanup();
	}


	exit(0);
	// exit๋กœ ข…๋ฃŒ๋ฅผ •˜๋ฉด ๋ชจ๋“  ŒŒผ ๋””Šคฌ๋ฆฝ„ฐ๋ฅผ ž๋™œผ๋กœ ๋‹ซ๊ณ  ข…๋ฃŒ•œ๋‹ค.
}

โ€ป ปด“จ„ฐ๋Š” •˜๋‚˜˜ ฒ˜๋ฆฌ๋ฐ–— •˜ง€ ๋ชป•œ๋‹ค. ๋”ฐ๋ผ„œ œ„˜ †ŒŠค๋Š” •˜๋‚˜˜ client๋ฐ–— ๋ฐ›•„ ๋“คผ ˆ˜ ๋ฐ–— —†๋‹ค.
–ด๋–ป๊ฒŒ •˜๋ฉด —ฌ๋Ÿฌ client๋ฅผ ๋™‹œ— ๋ฐ›•„๋“คผ ˆ˜ žˆ„๊นŒ?

8. ‹คŠต

œ„˜ server —  ‘† •˜๋Š” client ”„๋กœ๊ทธ๋žจ„ งœ๊ณ , Server๊ฐ€ ๋ณด๋‚ด๋Š” ๋ฉ”„ง€ธ "Hello, World!"๋ž€ ๋ฌธžฅ„ clinet ™”๋ฉด— ถœ๋ ฅ•˜๋„๋ก •œ๋‹ค.

9. ฐธ๊ณ  ‚ฌดŠธ

An Introduction to Socket Programming : http://www.uwo.ca/its/doc/courses/notes/socket/

Beej's Guide to Network Programming : http://www.ecst.csuchico.edu/~beej/guide/net/html/

Beej's ๋ฒˆ—ญŒ : „œน˜—”„—„œ ฐพ•„๋ณด„š”. (๋ฌด…ž„)

Socket Programming in Python : http://www.amk.ca/python/howto/sockets/

IPv6 Socket Programming : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_IPv6_Programing?action=print2

----
”„๋กœ๊ทธ๋ž˜๋ฐ๋ถ„๋ฅ˜
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:20
Processing time 0.0881 sec