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.0343 sec