280 likes | 423 Views
Module 4 – Sockets. Objectives. Socket 의 정의 및 개요에 대해 이해한다 . Communication Domain 의 개념과 Socket type 에 대해 알아본다 . Internet name 과 address conversion 에 대해 알아본다 . Connection-oriented/Connectionless Socket System Call 에 대해 알아본다 . TCP 와 UDP 를 사용하는 Client-Server program 을 설계하고 작성한다.
E N D
Objectives • Socket의 정의 및 개요에 대해 이해한다. • Communication Domain의 개념과 Socket type에 대해 알아본다. • Internet name과 address conversion에 대해 알아본다. • Connection-oriented/Connectionless Socket System Call에 대해 알아본다. • TCP와 UDP를 사용하는 Client-Server program을 설계하고 작성한다.
Socket introduction • 정의 • TCP/IP를 이용하는 응용 프로그래밍 인터페이스(Application Programming Interface: API) • 소프트웨어로 만들어진 통신의 접속 점 • UNIX system을 위하여 가장 많이 보급되고 있는 두 가지 통신 API • Berkeley socket • System V TLI(Transport Layer Interface)
Socket Interface 응용 1 응용 2 응용 3 5 ~ 7 소켓 인터페이스 소켓 1 소켓 2 소켓 3 3 4 TCP/IP 1 2 네트워크 드라이브 Network
Sockets as a Form of IPC Host 1 Host 2 Socket Proc 1 Proc 1 Internet domain UNIX domain Proc 2
Descriptor 파일 기술자 또는 소켓 기술자 (파일 또는) 소켓 데이터 구조체 pointer 0 pointer Family : PF_INET 1 Service : SOCK_STREAM pointer 2 Local IP : Local port : pointer 3 Remote IP : . . . Remote port : . . . Descriptor Table (파일 또는 소켓)
연결형 서비스 비연결형 서비스 응용 1 (fd=3, sd=4) 응용 2 (sd=3) 응용 3 (sd=3) 응용 4 (sd=3) 소켓 인터페이스 소켓 1 소켓 2 소켓 2 소켓 3 소켓 3000 3001 3002 3003 트랜스포트 계층 TCP UDP 포트 IP 인터넷 계층 TCP/IP 203.252.134.170 Network Application, Socket and TCP/IP fd : File Descriptor IP : Internet Protocol sd : Socket Descriptor TCP : Transmission Control Protocol UDP : User Datagram Protocol
Socket types and Domains • Socket type • SOCK_DGRAM DataGram • SOCK_STREAM Virtual circuit, byte stream • SOCK_RAW Raw • Communications domain 정의 • How sockets are named • Which protocols are used to send and receive data • 대부분의 UNIX에서 제공하는 두 가지 표준 도메인 • UNIX domain • Internet domain • Many other domains are possible • XNS, X.25 • Not all socket types will be supported in each domain.
UNIX Domain Sockets • AF_UNIX • Supported socket types : • SOCK_STREAM similar to pipes • SOCK_DGRAM unreliable, message-based • Sockets named in the UNIX file system • Defined in /usr/include/sys/un.h • Address structure • struct sockaddr_un
Internet Domain Sockets • AF_INET • Supported socket types: • SOCK_STREAM access to TCP protocol • SOCK_DGRAM access to UDP protocol • SOCK_RAW access to IP or ICMP protocol • Socket names are (Internet address, port number) pairs. • Address structure • Struct sockaddr_in • Defined in /usr/include/netinet/in.h
bind() listen() accept() socket() read()/recv() read()/recv() write()/send() write()/send() Connection-oriented protocol에 대한 socket system calls Server (connection-oriented protocol) socket() Client connection establish blocks until connection from client connect() data (request) process request data (reply) Shoutdown() And/or Close() Shoutdown() And/or Close()
Server (connectionless protocol) socket() Client bind() socket() recvfrom() bind() blocks until data received from a client data (request) sendto() recvfrom() process request data (reply) Normally block waiting for reply sendto() Connectionless protocol에 대한 socket system calls
Sockets system function • socket () #include <sys/socket.h> int socket (int family, int type, int protocol); • family : • AF_UNIX UNIX internalprotocols • AF_INET Internet protocols • AF_NS Xerox NS protocols • AF_IMPLINK IMP link layer • return value : sock 지정번호, sockfd • socket type • SOCK_STREAM stream socket • SOCK_DGRAM datagram socket • SOCK_RAW raw socket • SOCK_SEQPACKET sequenced packet socket • SOCK_RDM reliably delivered message socket (not implemented yet)
Socketpair System call • socketpair() #include <sys/socket.h> int socketpair ( int family, // domain name int type, // socket type int protocol, // protocol int sockvec[2] // 소켓 지정 번호 ); • Return • Success : 0 • Failure : -1 and errno set to indicate error
Elementary Socket System call • bind() #include <sys/socket.h> int bind ( int socket, // 소켓 넘버 const struct sockaddr *address, // 소켓과 연결할 자신의 주소를 가리키는 포인터 size_t address_len // address가 가리키는 구조체의 크기 ); • Return • Success : 0 • Failure : -1 and errno set to indicate error
Listen() system call • listen() #include <sys/socket.h> int listen ( int sockfd, // 소켓 번호 int backlog // 연결을 기다리는 클라이언트의 최대 수 ); • Return • Success : 0 • Failure : -1 and errno set to indicate error
connect System call • connect () • local system과 외부 system사이의 실제적인 connection을 설정 #include <sys/socket.h> int connect ( int sockfd, // 소켓 번호 struct sockaddr *servaddr, // 연결된 상대방의 주소 구조체를 가리키는 포인터 int addrlen // address가 가리키는 구조체의 크기 ); • Return • Success : 0 • Failure : -1 and errno set to indicate error
accept() system call • accept () • Connect로 부터 연결을 수락 #include <sys/socket.h> int accept ( int sockfd, // 소켓 번호 struct sockaddr *peer, // 연결 요청을 한 상대방의 주소를 저장하기 위한구조체를 가리키는 포인터 int *addrlen // peer가 가리키는 구조체의 크기를 가리키는 포인터 ); • Return • Success : 음이 아닌 정수(new socket descriptor) • Failure : -1 and errno set to indicate error
send system call • send () #include <sys/socket.h> size_t send( int socket, // 소켓 번호 const void *buffer, // 전송할 메시지를 가리키는 포인터 size_t length, // 전송할 메시지의 크기 int flags // 송신 방법 ); • flags • MSG_OOB 대역외 데이터의 발신 또는 수신 (TCP Only) • MSG_DONTROUT routing을 적용하지 않음 • Return • Success : 전송된 데이터의 길이 • Failure : -1
sendto system call • sendto () #include <sys/socket.h> ssize_t sendto ( int socket, // 소켓 번호 const void *buffer, //전송할 메시지를 가리키는 포인터 size_t length, //전송할 메시지의 크기 int flags, // 송신 방법 const struct sockaddr *dest_addr, // 전송할 목적지 주소 구조체 포인터 size_t dest_len // 목적지 주소 구조체의 크기 ); • Return • Success : 전송된 데이터의 길이 • Failure : -1
recv( ) system call • recv () #include <sys/socket.h> int recv ( int sockfd, //소켓 번호 char *buff, //데이터를 읽어 들일 버퍼의 포인터 int nbytes, //버퍼의 크기 int flags //읽는 방법 ); • flags • MSG_OOB 대역외 데이터의 발신 또는 수신(TCP Only) • MSG_PEEK "Peek" at the data present on the socket • Return • Success : 읽어 들인 바이트 수 • Failure : -1
recvfrom( ) system call • recvfrom () #include <sys/socket.h> int recvfrom( int sockfd, //소켓 번호 char *buff, //데이터를 읽어 들일 버퍼의 주소 int nbytes, //읽어 들이고자 하는 데이터의 크기 int flags, //읽는 방법 struct sockaddr *from, //데이터를 송신한 호스트의 주소 int *addrlen //addr 구조체의 크기 ); • Return • Success : 읽어 들인 데이터의 바이트 수 • Failure : -1
bcopy, bzero, bcmp system call • bit and byte string operations #include <strings.h> void bcopy ( const void *s1, //소스 의 포인터 void *s2, //복사할 곳의 포인터 size_t n ); //소스에서 nbyte void bzero ( void *s, //from 스트링의 시작 위치 size_t n); //n byte만큼 int bcmp ( const void *s1, //첫번째 스트링 const void *s2, //두번째 스트링 size_t n); //n byte 만큼 • Return • Success : 0 • Fauile : -1
Socket을 사용한 Client/Server Example • TCP, UDP 기반 Echo 프로그램 • 구성 파일 • 서버 : TCP_srv.c, UDP_srv.c • 클라이언트 : TCP_clnt.c, UDP_clnt.c • 그 외 데이터 입출력 및 데몬을 위해 필요한 파일