Presentation is loading. Please wait.

Presentation is loading. Please wait.

Network Lab. Seoung Hyeon, Lee

Similar presentations


Presentation on theme: "Network Lab. Seoung Hyeon, Lee"— Presentation transcript:

1 Network Lab. Seoung Hyeon, Lee shlee@netwk.hannam.ac.kr
TCP/IP Socket Programming… 네트워크 프로그래밍과 소켓의 이해 Network Lab. Seoung Hyeon, Lee

2 목차 네트워크 개요 소켓 개요 소켓 프로그래밍 리눅스 소켓 프로그래밍 리눅스 파일 조작 프로그래밍 윈도우 소켓 프로그래밍

3 네트워크 개요 네트워크(Network) 네트워크란 각 호스트(End-System)들을 연결하는 하나의 단일 System을 의미
Ex) 개인용 PC, 워크스테이션, PDA 등

4 네트워크 개요 인터넷(Internet) 서로 멀리 떨어진 둘 이상의 네트워크가 연결된 거대한 네트워크를 의미
인터넷을 구축하기 위해서는 서로 다른 네트워크를 연결하는 장비(=라우터)가 필요 Network A Network B Router

5 네트워크 개요 클라이언트/서버(Client/Server) 모델 Server/Client = 단일 프로그램
Request Response

6 네트워크 개요 Server 종류 Server는 Client에게 서비스를 제공하기 때문에 Client에 비해 복잡한 제어와 구조를 포함 Iterative server : 서비스를 한 순간에 하나의 클라이언트에게 제공 Concurrent Server : 서비스를 동시에 여러 클라이언트에게 제공 Server Client

7 네트워크 개요 네트워크 프로그래밍 원 거리 사용자간의 원활하고 빠른 의사 소통을 위해 활용
네트워크로 연결되어 있는 두 호스트간의 데이터 송수신 파일 입/출력과의 차이점은 데이터를 주고 받는 대상 소켓(Socket)을 사용하여 프로그래밍 소켓 : 원격 호스트를 연결시켜 주는 매개체 역할을 수행 사용 예 Messenger, On-line 게임, ftp, telnet 등 다양한 분야에 사용

8 소켓 개요 What is socket? 소켓(socket)은 네트워크를 통한 입/출력을 하기 위해 사용자에게 필요한 수단을 제공하는 응용 프로토콜 인터페이스 소켓을 활용한 네트워크 응용 프로그램을 통해 네트워크상에서 데이터를 송/수신 네트워크 입/출력을 위한 요소 프로토콜(Protocol) 소스 IP 주소(Source IP Address) 소스 포트 번호(Source Port Address) 목적지 IP 주소(Target IP Address) 목적지 포트 번호(Target Port Address)

9 소켓 개요 소켓 인터페이스 위치 소켓 인터페이스 네트워크 응용 1 응용 2 응용 3 소켓 1 소켓 2 소켓 3 TCP/IP
네트워크 드라이브 (OSI 계층) 네트워크 소켓 인터페이스 5 - 7 4 3 2 1

10 소켓 개요 응용 프로그램과 소켓 연결형 서비스 비연결형 서비스 응용 2 sd=3 응용 3 응용 4 응용 프로그램 (소켓번호)
응용 1 sd=4 TCP UDP (포트번호) 트랜스포트 계층 소켓 인터넷 계층 (IP주소) IP TCP/IP 3000 3001 3002 3003 네트워크

11 소켓 개요 TCP/UDP 소켓 TCP Socket 개요 Connection Oriented(연결형) 신뢰성 보장 SERVER
CLIENT socket() bind() listen() accept() recv() send() close() connect() 연결 요청 데이터 송수신 close()

12 소켓 개요 TCP/UDP 소켓 UDP Socket Connectionless(비 연결형) 비 신뢰적 전송 속도가 빠름
SERVER CLIENT socket() bind() recvfrom() sendto() close() 데이터 송수신 종 료

13 소켓 프로그래밍 소켓 주소 구조체 <sys/socket.h> struct sockaddr {
소켓이 지원하는 프로토콜에 맞게 재정의 <sys/socket.h> struct sockaddr { unsigned short sa_family; char sa_data[14]; } struct sockaddr_in { short sin_family; short sin_port; struct in_addr sin_addr; char sin_zero[8]; struct in_addr { unsigned long s_addr; - sin_family(주소 체계)는 AF_INET, AF_UNIX, AF_NS 등이 있으며, TCP/IP에서는 AF_INET를 사용 - sin_port는 16비트의 포트번호를, - sin_addr는 32비트 IP 주소를 의미

14 소켓 프로그래밍 소켓 함수 소켓 생성(socket()) 소켓 프로그래밍에서 통신 창구 역할 통신을 위한 end-point 생성
소켓 번호 리턴 int socket( int domain, // 프로토콜 체계 int type, // 서비스 타입 int protocol ); // 소켓에 사용할 프로토콜 domain : 소켓에 사용되는 프로토콜 패밀리 AF_INET, AF_UNIX, AF_NS type : 소켓의 유형 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW protocol : 소켓에 사용되는 프로토콜을 기술 대개의 경우 0로 한다.

15 소켓 프로그래밍 소켓 함수 소켓 생성(socket()) int domain int type int protocol
PF_INET : 인터넷 프로토콜 체계 사용 PF_INET6 : IPv6 프로토콜 체계 사용 PF_UNIX : 유닉스 방식의 프로토콜 체계 사용 int type SOCK_STREAM : 스트림 방식의 소켓 생성 ( TCP ) SOCK_DGRAM : 데이터그램 방식의 소켓 생성 ( UDP ) SOCK_RAW : 사용자가 직접 정의 int protocol 구체적인 프로토콜을 정의 할때 사용 대부분의 응용 프로그램에서 ‘0’ 사용

16 소켓 프로그래밍 소켓 함수 소켓 연결(connect()) 서버에 접속 요청
서버의 IP 주소와 포트 번호가 포함되어 있는 소켓 구조체 int connect( int sockfd, // 소켓 번호 struct sockaddr *serv_addr, // 서버 소켓 구조체 int addr_len ); // 구조체 크기 sockfd : 소켓 기술자 *serv_addr : 접속하고자 하는 서버의 정보가 있는 소켓 구조체 addr_len : 구조체 sockaddr의 크기

17 소켓 프로그래밍 소켓 함수 주소 할당(Bind()) 소켓 번호와 소켓 주소 연결 클라이언트와 서버가 통신하기 위해
소켓 번호 : 응용 프로그램 소켓 주소 : 네트워크 시스템 클라이언트와 서버가 통신하기 위해 int bind( int sockfd, // 소켓 번호 struct sockaddr *sv_addr, // 서버 소켓 구조체 int addr_len ); //구조체 크기 sockfd : socket()이 반환된 소켓 기술자 *sy_addr : 소켓 주소체로 자신의 주소와 프로토콜, 포트 번호를 지정한 후 사용 addr_len : 구조체 sockaddr의 크기

18 소켓 프로그래밍 소켓 함수 연결요청 대기 상태(listen()) 클라이언트로부터 연결 요청을 기다리는 수동 대기 모드
int listen( int sockfd, // 소켓 번호 int log ); // 연결을 기다리는 최대 클라이언트 수 sockfd : 소켓 기술자 log : 접속 요청을 동시에 받아들일 수 있는 큐의 크기를 지정하며, n이 5일 경우 서버는 동시에 5개의 클라이언트 접속 요청을 받을 수 있다.

19 소켓 프로그래밍 소켓 함수 연결 요청 수락(accept()) 소켓에 연결을 받아 들임
새로운 소켓 번호 생성 >> 클라이언트와 통신 int accept( int sckfd, // 소켓 번호 struct sockaddr *addr, // 클라이언트 소켓 구조체 int *addr_len ); // 구조체 크기 sockfd : 소켓 기술자 *addr : 접속을 허가해 준 클라이언트에 대한 소켓 구조체로 클라이언트의 정보를 알 수 있다. addr_len : 구조체 sockaddr의 크기

20 소켓 프로그래밍 소켓 함수 데이터 전송(send()) TCP 소켓을 통해 데이터를 송신
int send( int sockfd, // 소켓 번호 char *buf, // 전송할 메세지가 저장된 버퍼 int buflen, // 버퍼 길이 int flags ); // 송신 방법 (보통 0을 사용) sockfd : 소켓 기술자 *buf : 전송할 데이터가 저장된 버퍼의 포인터 buflen : buf의 크기 flags : 데이터에 대한 처리 요구 지정(대개의 경우, 0)

21 소켓 프로그래밍 소켓 함수 데이터 전송(write()) int write( int sockfd, // 소켓 번호
char *buf, // 전송할 메세지가 저장된 버퍼 int buf_len ); // 버퍼 길이 sockfd : 소켓 기술자 *buf : 전송할 데이터가 저장된 버퍼의 포인터 buf_len : buf의 크기

22 소켓 프로그래밍 소켓 함수 데이터 수신(recv()) TCP 소켓으로부터 데이터를 수신
int recv( int sockfd, // 소켓 번호 char *buf, // 수신 메시지를 저장할 버퍼 int buflen, // 버퍼 길이 int flags ); // 수신 방법 (보통 0을 사용) sockfd : 소켓 기술자 *buf : 수신 데이터를 저장할 버퍼의 포인터 buflen : buf의 크기 flags : 데이터에 대한 처리 요구 지정(대개의 경우, 0)

23 소켓 프로그래밍 소켓 함수 데이터 수신(read()) int read( int sockfd, // 소켓 번호
char *buf, // 수신 메시지를 저장할 버퍼 int buf_len ); // 버퍼 길이 sockfd : 소켓 기술자 *buf : 수신 데이터를 저장할 버퍼의 포인터 buf_len : buf의 크기

24 int close( int sockfd ); // 닫을 소켓 번호
소켓 프로그래밍 소켓 함수 소켓 종료(close()) 소켓을 종료 Socket()에 의해 생성된 sockft와 관련된 접속을 닫는다. 대부분의 경우 클라이언트가 서버와의 접속을 끊을 대 사용하며, 네트워크 입출력에서는 반드시 close()를 통해 소켓에 대한 작업을 종료한다. int close( int sockfd ); // 닫을 소켓 번호 sockfd : socket()이 반환된 소켓 기술자

25 리눅스 소켓 프로그래밍 “Hello World!” 프로그램 설정 소켓 구조체 변수 설정 파싱 소켓 생성 및 주소 할당
설정 값 대기 상태 및 연결 대기 상태 클라이언트 연결 요청 수락 메시지 전송 서버 메시지 입력 메시지 전송 메시지 출력 종료 연결 종료 프로그램

26 리눅스 소켓 프로그래밍 서버 소켓 구현 서버 소켓 생성 구조체 및 변수 생성 정보 설정 소켓 생성 소켓 주소 할당 할당 및
에러 처리 서버 소켓 주소 연결 요청 대기 상태 요청 버퍼 연결 요청 대기 연결 및 데이터 전송 클라이언트 수락 및 소켓 연결 데이터 전송 연결 종료 소켓 종료 socket() 에러 처리 bind() 에러 처리 listen() 에러 처리 accept() 에러 처리

27 리눅스 소켓 프로그래밍 서버 소켓 구현 #include <stdio.h>
#include <stdlib.h> int main(int argc, char **argv){ int serv_sock; int clnt_sock; serv_sock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 소켓 생성 */ if(serv_sock == -1) error_handling("socket() error"); if( bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 ) /* 소켓에 주소 할당 */ if( listen(serv_sock, 5)==-1 ) /* 연결 요청 대기 상태로 진입 */ clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size); /* 연결 요청 수락 */ write(clnt_sock, message, sizeof(message)); /* 데이터 전송 */ close(clnt_sock); /* 연결 종료 */

28 리눅스 소켓 프로그래밍 클라이언트 소켓 구현 클라이언트 소켓 생성 구조체 및 변수 생성 정보 설정 소켓 생성 서버로 연결 요청
서버 주소 소켓 번호 데이터 수신 데이터 수신 출력 연결 종료 소켓 종료 에러 처리 socket() 에러 처리 connect() 에러 처리 read() 에러 처리

29 리눅스 소켓 프로그래밍 클라이언트 소켓 구현 #include <stdio.h>
#include <stdlib.h> main(int argc, char **argv){ int sock; struct sockaddr_in serv_addr; sock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 접속을 위한 클라이언트 소켓 생성 */ if(sock == -1) error_handling("socket() error"); if( connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) /* 서버로 연결 요청 */ str_len=read(sock, message, sizeof(message)-1); /* 데이터 수신 */ message[str_len]=0; printf("Message from server : %s \n", message); close(sock); /* 연결 종료 */

30 리눅스 소켓 프로그래밍 실행 결과 서버 프로그램 실행 클라이언트 프로그램 실행

31 리눅스 파일 조작 프로그래밍 Low-level File Access
리눅스 혹은 윈도우 자체에서 제공하는 파일 입출력 함수를 사용하여 파일을 관리(파일의 생성 및 삭제, 데이터 입력 및 출력)하는 것을 의미 리눅스는 모든 것을 파일로 관리 파일, 소켓, 표준 입력, 표준 출력 주의 : 표준 입출력 함수 해당 파일에 파일 디스크립터를 할당해서 관리 파일 디스크립터 = 정수

32 리눅스 파일 조작 프로그래밍 파일 디스크립터 파일을 관리하기 위해서 모든 파일(파일, 소켓, 표준 입/출력)에 파일 디스크립터를 할당 파일 디스크립터 대 상 표준 입력 1 표준 출력 2 표준 에러 출력 Operating System 파일 A 소켓 B 소켓 C 파일 D Program 7 5

33 리눅스 파일 조작 프로그래밍 파일 조작 함수 파일 열기(open()) 파일을 열기 위한 함수로 두개의 인자를 받음
int open( const char *path //파일 경로 int flag); //파일 모드 *path : 파일의 경로를 포함한 이름을 나타내는 문자열의 포인터 flag : 파일 오픈 모드 MODE 의 미 O_CREAT 필요한 경우 파일을 생성 O_TRUNC 존재하던 데이터를 모두 삭제 O_APPEND 존재하던 데이터를 보존하고 뒤에 이어서 저장 O_RDONLY 읽기 전용 모드로 파일을 오픈 O_WRONLY 쓰기 전용 모드로 파일을 오픈 O_RDWR 읽기 쓰기 겸용 모드로 파일을 오픈

34 리눅스 파일 조작 프로그래밍 파일 조작 함수 파일 닫기(close()) 파일을 닫기 위한 함수로 하나의 인자를 받음
int close(int fildes); //파일 디스크립터 fildes : 닫아줄 파일의 파일 디스크립터

35 리눅스 파일 조작 프로그래밍 파일 조작 함수 데이터 쓰기(write()) 데이터를 출력하기 위한 함수로 세개의 인자를 받음
ssize_t write( int fildes, //파일 디스크립터 const void *buf, //버퍼 포인터 size_t nbytes); //전송 데이터 fildes : 데이터 전송 영역을 나타내는 파일 디스크립터 *buf : 전송할 데이터를 가지고 있는 버퍼의 포인터 nbytes : 전송할 데이터의 바이트 수

36 리눅스 파일 조작 프로그래밍 파일 조작 함수 데이터 읽기(read()) 데이터를 입력 받기 위한 함수로 세 개의 인자를 가짐
ssize_t read( int fildes, //파일 디스크립터 void *buf, //버퍼 포인터 size_t nbytes); //수신 데이터 fildes : 데이터를 전송해 주는 대상을 가리키는 파일 디스크립터 *buf : 수신 한 데이터를 저장할 버퍼를 가리키는 포인터 nbytes : 수신할 최대 바이트 수

37 리눅스 파일 조작 프로그래밍 문서 저장 파일 생성 정보 파일명 파일 생성 파일 디스크립터 디스크립터 획득 출력 파일 저장 버퍼
내용 문서 작성 종료 파일 종료 프로그램 에러 처리 open() 에러 처리 write() 에러 처리

38 리눅스 파일 조작 프로그래밍 데이터 쓰기 #include <stdio.h>
#include <unistd.h> int main(void) { int fildes; fildes=open("data.txt", O_CREAT|O_WRONLY|O_TRUNC); /* data.txt라는 이름의 파일 생성 */ if( fildes==-1) error_handling("open() error!"); if(write(fildes, buf, sizeof(buf))==-1) /* 생성한 파일에 buf의 내용 전달 */ close(fildes); return 0; }

39 리눅스 파일 조작 프로그래밍 데이터 읽기 파일 오픈 파일 정보 오픈 파일 디스크립터 디스크립터 획득 출력 파일 읽기 문서 내용
버퍼 저장 종료 파일 종료 프로그램 에러 처리 open() 에러 처리 read() 에러 처리

40 리눅스 파일 조작 프로그래밍 데이터 읽기 #include <stdio.h>
#include <unistd.h> #define BUFSIZE 100 int main(void) { int fildes; char buf[BUFSIZE]; fildes=open("data.txt", O_RDONLY); /* data.txt라는 이름의 파일 오픈 */ if( fildes==-1) error_handling("open() error!"); printf("오픈 한 파일의 파일 디스크립터는 %d 입니다.\n" , fildes); if(read(fildes, buf, sizeof(buf))==-1) /* 파일에 존재하는 내용을 buf로 읽어 들인다. */ printf("파일의 내용 : %s", buf); close(fildes); return 0; }

41 리눅스 파일 조작 프로그래밍 파일 디스크립터와 소켓 소켓 생성 구조체 및 변수 생성 정보 설정 파일 생성 생성 정보 파일
파일 디스크립트 출력 소켓 파일 종료 프로그램 종료

42 리눅스 파일 조작 프로그래밍 파일 디스크립터와 소켓 #include <stdio.h>
#include <fcntl.h> int fdes1, fdes2, fdes3; fdes1 = socket(PF_INET, SOCK_STREAM, 0); /* 소켓 생성 */ fdes2 = open("test.dat", O_CREAT); /* 파일 생성 */ fdes3 = socket(PF_INET, SOCK_DGRAM, 0); /* 소켓 생성 */ printf("첫 번째 파일 디스크립터 : %d\n", fdes1); printf("두 번째 파일 디스크립터 : %d\n", fdes2); printf("세 번째 파일 디스크립터 : %d\n", fdes3); close(fdes1); close(fdes2); close(fdes3); return 0;}

43 리눅스 파일 조작 프로그래밍 실행 결과

44 윈도우 소켓 프로그래밍 윈도우 소켓 WinSock 윈속을 사용
상당 부분 BSD 계열 유닉스 소켓을 참고로 설계되었기 때문에 많은 부분이 리눅스 기반 소켓과 유사 윈속을 사용 Winsock2.h 헤더 파일을 포함 Ws2_32.lib 라이브러리를 링크 윈속 사용을 위한 라이브러리 초기화 및 해제

45 윈도우 소켓 프로그래밍 윈도우 소켓

46 윈도우 소켓 프로그래밍 윈속 함수 윈속 초기화(WSAStartup())
프로그램에 호출하는 윈속 버전을 알려줘, 해당 버전의 윈속 사용을 위한 라이브러리 초기화 #include <winsock2.h> int WSAStartup( WORD wVersionRequested, //요구하는 윈속 버전 LPWSADATA lpWSAData); // 변수의 포인터 wVersionRequested : 프로그램에서 요구하는 윈속의 최상위 버전을 알려주기 위해 사용 WORD는 16비트 unsigned int를 의미 lpWSAData : WSADATA 타입 변수의 포인터를 인자로 전달

47 윈도우 소켓 프로그래밍 윈속 함수 윈속 해제(WSACleanup())
소켓에 대한 연결이 종료되었을 경우 할당 받은 리소스를 해제하는 작업을 수행 int WSACleanup (void); Void : 리턴 값 없음

48 윈도우 소켓 프로그래밍 윈속 소켓 함수 SOCKET socket(int af, int type, int protocol);
int bind (SOCKET s, const struct sockaddr FAR * name, int namelen); int listen(SOCKET s, int backlog); SOCKET accept(SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen); int connect(SOCKET s, const struct sockaddr FAR * name, int namelen); 각 인자 값은 리눅스 소켓 함수와 유사하거나 동일하다.

49 윈도우 소켓 프로그래밍 윈속 소켓 함수 데이터 전송(send()) BSD 기반과 다른 함수를 활용
#include <winsock2.h> int send( SOCKET s, //소켓 핸들러 const char FAR *buf, //전송할 데이터 버퍼 int len, //바이트 수 int flags ); //옵션 설정 S : 데이터를 전송할 호스트에 연결된 소켓의 핸들을 인자로 전달 *buf : 전송할 데이터를 저장하고 있는 버퍼를 가리키는 포인터 len : 전송할 바이트 수를 인자로 전달 flags : 함수 호출 시, 여러가지 옵션을 설정하기 위해 사용

50 윈도우 소켓 프로그래밍 윈속 소켓 함수 데이터 수신(recv()) #include <winsock2.h>
int recv( SOCKET s, //소켓 핸들러 char FAR *buf, //수신된 데이터 버퍼 int len, //바이트 수 int flags ); //옵션 설정 s : 데이터를 수신할 영역을 나타내는 소켓의 핸들 *buf : 수신할 데이터를 저장할 버퍼를 가리키는 포인터 len : 수신할 최대 바이트 수 flags : 함수 호출 시, 여러 가지 옵션을 설정하기 위해서 사용

51 윈도우 소켓 프로그래밍 “Hello World!” 프로그램 설정 소켓 구조체 변수 설정 파싱 소켓 생성 및 주소 할당
설정 값 대기 상태 및 연결 대기 상태 클라이언트 연결 요청 수락 메시지 전송 서버 메시지 입력 메시지 전송 메시지 출력 종료 연결 종료 프로그램

52 윈도우 소켓 프로그래밍 서버 프로그램 구현 서버 소켓 생성 구조체 및 변수 생성 정보 설정 소켓 생성 소켓 주소 할당 할당 및
에러 처리 서버 소켓 주소 연결 요청 대기 상태 요청 버퍼 연결 요청 대기 연결 및 데이터 전송 클라이언트 수락 및 소켓 연결 데이터 전송 연결 종료 소켓 종료 윈속 반환 윈속 초기화 초기화 변수 socket() 에러 처리 bind() 에러 처리 listen() 에러 처리 accept() 에러 처리 WSAStartup() 에러 처리

53 윈도우 소켓 프로그래밍 서버 프로그램 구현 #include <winsock2.h>
int main(int argc, char **argv) { WSADATA wsaData; SOCKET hServSock; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) /* Load Winsock 2.2 DLL */ ErrorHandling("WSAStartup() error!"); hServSock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 소켓 생성 */ if( bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR ) /* 소켓에 주소 할당 */ if( listen(hServSock, 5)==SOCKET_ERROR) /* 연결 요청 대기 상태 */ hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr,&szClntAddr); /* 연결 요청 수락 */ send(hClntSock, message, sizeof(message), 0); /* 데이터 전송 */ closesocket(hClntSock); /* 연결 종료 */ WSACleanup(); return 0; }

54 윈도우 소켓 프로그래밍 클라이언트 프로그램 구현 클라이언트 소켓 생성 구조체 및 변수 생성 정보 설정 소켓 생성
서버로 연결 요청 연결 요청 서버 주소 소켓 번호 데이터 수신 데이터 수신 출력 연결 종료 소켓 종료 윈속 반환 에러 처리 socket() 에러 처리 connect() 에러 처리 read() 에러 처리 윈속 초기화 초기화 변수 WSAStartup() 에러 처리

55 윈도우 소켓 프로그래밍 클라이언트 프로그램 구현 #include <winsock2.h>
int main(int argc, char **argv) { WSADATA wsaData; SOCKET hSocket; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) /* Load WinhSocket 2.2 DLL */ ErrorHandling("WSAStartup() error!"); hSocket=socket(PF_INET, SOCK_STREAM, 0); /* 서버 접속을 위한 소켓 생성 */ if( connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR ) /* 서버로 연결 요청 */ strLen=recv(hSocket, message, sizeof(message)-1, 0); /* 데이터 수신 */ message[strLen]=0; closesocket(hSocket); /* 연결 종료 */ WSACleanup(); return 0; }

56 윈도우 소켓 프로그래밍 실행 결과 서버 프로그램 실행 클라이언트 프로그램 실행

57 mailto: shlee@netwk.hannam.ac.kr
Thank you… Q & A mailto:


Download ppt "Network Lab. Seoung Hyeon, Lee"

Similar presentations


Ads by Google