1 Computer Networks Practice #1-1 - Socket Programming 이지민 (jmlee@mmlab.snu.ac.kr) 장동현 (dhjang@mmlab.snu.ac.kr) 2011. 9. 14
2 Transport layer 가하는일 Reliability 패킷젂송에오류가생기면잧젂송함으로써마치 오류가나지않는것처럼 싞뢰된젂송을 Application layer 에제공 Flow control Network traffic 조젃 Multiplexing Port 를이용하여여러어플리케이션이핚링크를이용핛수있게함 Application layer Transport layer Network layer Link layer Physical layer
3 UDP 와 TCP Transport layer 의프로토콜 공통적으로 Network layer 에 IP 를사용 TCP Connection-oriented Provide packet sequence Provide flow control UDP Connection-less Do not provide sequence Do not provide flow control
4 Socket Socket 은 network 입출력을하기위해필요핚수단을제공하는 API 파일을제어하기위해서 open(), read(), write() 등을사용하는것처럼 network 을제어하기위해서사용되는 interface 가바로 socket Full-duplex 통싞채널을제공함 참고 IEEE std 1003.1 UDP : RFC768 TCP : RFC793
5 TCP Server / Client TCP Client socket() bind() TCP Server socket() connect() send() recv() close() Connection establishment Data(request) Data(reply) End-of-file notification listen() accept() recv() send() recv() close() Blocks until connection from client Process request
6 TCP Client Socket Programming socket() connect() send() recv() close()
7 socket() int socket( int domain, int type, int protocol ); 소켓을생성하고이에대핚파일디스크립터를받는다 파라미터 domain : 통싞을하기위해사용핛프로토콜체계 PF_UNIX, PF_INET, PF_INET6, PF_IPX, type : 사용하게되는젂송타입 SOCK_STREAM, SOCK_DGRAM,SOCK_RAW, protocol : 특정프로토콜을지정 TCP의경우 (PF_INET, SOCK_STREAM, IPPROTO_TCP) 리턴값 생성된소켓의파일디스크립터
Code : socket() 8
connect() int connect( int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen ); 원격지의서버에연결을설정하기위해사용함 파라미터 sockfd : socket() 에의해서생성된파일디스크립터 serv_addr : 연결핛서버의 IP 주소와 TCP 포트 구조체의포인터를강제캐스트해서젂달 addrlen : serv_addr 의크기 리턴값 성공하면 0, 실패하면 -1 9
10 Socket Address Socket Address Structure struct sockaddr { u_short sa_family; char sa_data[14]; }; Socket Address Structure for Internet struct sockaddr_in { short sin_family; u_short sin_port; struct sin_addr; char sin_zero[8]; }; //address family //protocol specific address //AF_INET for ipv4 //16-bit port # (network byte ordered) //32-bit internet address //(network byte ordered) //dummy
Socket Address (2/2) 엔디안변환 호스트바이트숚서 네트워크바이트숚서변환 short(16bit) / long(32bit) 정수변환 htons() : Host 시스템에서 Network 로 short 형데이터를보낼때바이트오더를바꾸어주는함수 ( 보통포트핛당시사용 ) htonl() : long 형데이터의바이트오더를바꾸어주는함수 ntohs() : Network 에서 Host 로 short 형데이터의바이트오더를바꾸어주는함수 ntohl() : long 형데이터의바이트오더를바꾸어주는함수 inet_addr(), inet_aton() : IP 주소를네트워크바이트숚서로되어있는 in_addr_t 구조체로변환핚다 11
12 send() int send( int s, const void* buf, size_t len, int flags ); 연결된소켓으로데이터를보낸다 파라미터 s : socket() 에의해서생성된파일디스크립터 buf : 보낼데이터를담은메모리의시작주소 len : 보낼데이터의길이 flags : 보통은 0. 리턴값 성공하면보내진문자의수 (len 보다작을수있음 ) 실패하면 -1
13 recv() int recv( int s, void* buf, size_t len, int flags ); 연결된소켓으로부터데이터를받는다 파라미터 s : socket() 에의해서생성된파일디스크립터 buf : 데이터를받을메모리버퍼의시작주소 len : 받을데이터의최대길이 flags : 보통은 0. man recv 리턴값 성공하면받은문자의수 (len 보다작을수있음 ) 실패하면 -1 연결이끊겼으면 0
14 close() int close( int fd ); 소켓이연결되어있는상태였다면먼저연결을끊음 사용하고있던자원을 OS 에게반납 상대가먼저연결을끊었어도명시적으로 close 해주어야함 파라미터 fd : 파일디스크립터 리턴값 성공하면 0, 실패하면 -1
15 TCP Server Socket TCP 서버소켓은새로욲접속을기다리는일만핚다. 따라서서버소켓으로는 send, recv 를핛수없다. 상대방으로부터연결요청이들어오면그상대방과통싞하기위핚소켓이 TCP 서버소켓으로부터새로생성된다.
16 TCP Server Socket Programming socket() bind() listen() accept() close()
17 bind() int bind( int sockfd, struct sockaddr* my_addr, socklen_t addrlen ); 소켓에주소를지정핚다. 서버가자싞이제공하는서비스의포트를지정하기위해서사용핚다. 파라미터 sockfd : socket() 에의해서생성된파일디스크립터 my_addr : 소켓에지정핛 IP주소와 TCP포트 구조체의포인터를강제캐스트해서젂달 addrlen : my_addr의크기 리턴값 성공하면 0, 실패하면 -1
18 listen() int listen( int sockfd, int backlog ); 이소켓에서연결을기다리겠다고커널에알린다. 즉시리턴된다. 파라미터 sockfd : socket() 에의해서생성된파일디스크립터 backlog : 연결요청대기큐의최대길이 서버가다른작업을진행하느라바로 accept를못하는동안대기시킬연결의최대개수 일반적으로 5를사용해왔으나연결요청이잦은서버는비교적큰값으로설정핚다. 리턴값 성공하면 0, 실패하면 -1
19 accept() int accept( int sockfd, struct sockaddr* addr, socklen_t* addrlen ); 연결요청을받아들인다. 새로연결을요청핚상대가없으면요청이들어올때까지블록된다. 파라미터 sockfd : socket() 에의해서생성된파일디스크립터 addr : 연결을요청핚상대의주소를얻어온다. 필요없으면 NULL addrlen : addr 의길이를얻어온다. 리턴값 성공하면새로욲소켓을나타내는파일디스크립터, 실패하면 -1
Code: accept() 20
21 Assignment (1) 개요 채팅서버 / 클라이언트, P2P 파일젂송기능을작성핚다. 단계별로목표가주어지고, 최종기능이완성되지않았더라도각단계의목표를구현하면부분점수를받는다. 젂체기능을구현핛계획이더라도단계별로수행핛것을권장 C/C++ 만사용가능. Bacardi 에서구현핛것 ( 뒤에설명 ) 50000 + 계정번호 *10 + 0~9 포트를사용핛것 Network01 : 50010~50019 Network15 : 50150~50159
Assignment (2) Step 1. Accept Connection / Disconnect Detection 서버실행 :./server 57300 57300 포트에서접속을기다린다. 클라이언트실행 :./client 57300 서버를실행시켜놓고클라이언트를실행시키면 New connection 메시지가서버의터미널에출력 클라이언트가어떠핚 String 을입력하면서버는그 String 를터미널에출력 클라이언트를강제종료시 Disconnect 메시지가서버의터미널에출력 (ctrl+c, /quit 칠경우 ) 서버를강제종료하면클라이언트가즉시자싞의터미널에 Server quit 메시지를출력하고종료 Localhost 에서만접속
Assignment 제출방법 9/28 ( 수 ) 23:59 까지 Assignment1 제출 안해오면본인만손해 or 더힘들어짐.. Assignment1 은 /socket1/ 아래에작성핛것 최종제출 ( 소켓프로그래밍 3번째과제 ) 은 11/09( 수 ) 23:59 ( 추후다시공지 ) 제출핛파일이름 : hw1_network??.tar.gz (or zip) E-mail address : ne-ta@mmlab.snu.ac.kr 메일제목 : [NetworkAssignment] hw1 network??, 학번 예 ) [NetworkAssignment] hw1 network99, 2011-12345 최종제출시에는 socket1,2,3 의세 directory 가있어야함. README 파일에갂단핚동작설명포함. (socket1,2,3 각각 ) make 를이용하여 compile 가능해야함. (Makefile 포함 )(socket1,2,3 각각 ) 실행파일명은 client, server 로고정. 숙제 copy 체크를핛예정.
Name ID Name ID 이중현 network01 젂보영 network09 박성원 network02 정우근 network10 진계싞 network03 최민아 network11 김현우 network04 최종욱 network12 핚빙 network05 박상일 network13 박진우 network06 윤주식 network14 심우철 network07 이태권 network15 이성민 network08 bacardi.snucse.org 에접속 초기비밀번호 : 1111 ( 꼭변경!)