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