웹프로그래밍및실습 ( g & Practice) 문양세강원대학교 IT 대학컴퓨터과학전공 소켓 (Socket) (1/2) Socket 이란? 서버와클라이언트가서로특정한규약을사용하여데이터를전송하기위한방식 서버와클라이언트는소켓연결을기다렸다가소켓이연결되면서로데이터를전송 현재네트워크상에서의모든통신의근간은 Socket 이라할수있음 Page 2 1
소켓 (Socket) (2/2) socket() 함수 (socket_create()) int socket_create (int domain, int type, int protocol) domain: AF_INET (Internet), AF_UNIX (UNIX) 통상 AP_INET만사용함 type: SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW, SOCK_RDM 통상 UDP로서 SOCK_DGRAM을, TCP로서 SOCK_STREAM만을사용함 protocol: SOL_ICMP, SOL_UDP, SOL_TCP 통상 0를입력하면됨 리턴값이 -1 이면실패 ( 그렇지않으면성공 ) Page 3 UDP (User Data Protocol) (1/3) UDP 란? 비연결형 (connectionless) 통신프로토콜로서, 비교적간단한을할때사용함 패킷에데이터를실어서보내는데데이터를보내기전에서버와연결을하기위한작업이생략됨 데이터전송에대한신뢰성을보장하지않기때문에전송중에패킷을잃어버릴수있음 UDP socket_create() 에서 type 파라미터는 SOCK_DGRAM을사용 Page 4 2
UDP (User Data Protocol) (1/3) UDP 란? 비연결형 (connectionless) 통신프로토콜로서, 비교적간단한을할때사용함 패킷에데이터를실어서보내는데데이터를보내기전에서버와연결을하기위한작업이생략됨 데이터전송에대한신뢰성을보장하지않기때문에전송중에패킷을잃어버릴수있음 UDP socket_create() 에서 type 파라미터는 SOCK_DGRAM을사용 Page 5 UDP (User Data Protocol) (2/3) UDP 수행 ( 접속 ) 절차 클라이언트 create() 서버 create() bind() sendto() recvfrom() recvfrom() sendto() Page 6 3
UDP (User Data Protocol) (3/3) Bind (socket_bind()) int socket_bind (resource socket, string address [, int port]) Receive From (socket_recvfrom()) int socket_recvfrom (resource socket, string buffer, int length, int flag, string address, int port); Send To (socket_sendto()) int socket_sendto (resource socket, string buffer, int length, int flag, string address, int port); Close (socket_close()) bool socket_close (resource socket) Page 7 UDP 프로그램예제 (1/5) UDP 프로그램예제 클라이언트는단어들을서버에전송하고, 서버에서이를정렬하여다시클라이언트에전송하는프로그램 서버사이드 : udp_server.php UDP로클라이언트에서보낸데이터를수신 (socket_recvfrom) 하고, 이를단어순으로정렬 (preg_split, sort) 한후, 다시서버로송신 (socket_sendto) 한다. 클라이언트사이드 : udp_client.php UDP로서버에단어들을송신 (socket_sendto) 하고, 서버에서정렬된순서의단어들을수신 (socket_recvfrom) 한다. Page 8 4
UDP 프로그램예제 (2/5) udp_server.php <? $addr = gethostbyname('127.0.0.1'); $port = 5090; $buf = ""; $sock = socket_create(af_inet, SOCK_DGRAM, 0); if ($sock < 0) die (strerror ($sock)); socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1); if (($ret = socket_bind ($sock, $addr, $port)) < 0) die (strerror ($ret)); do { $read = socket_recvfrom($sock, $buf, 2048, 0, $addr, $port); echo "Receive data: $buf<br>"; $temp = preg_split ("/\s+/", $buf); // 문자열분해 (space 하나이상 ) sort ($temp); for ($i = count ($temp) - 1; $i >= 0; $i--) $resp.= $temp[$i]. " "; $send = socket_sendto ($sock, $resp, strlen ($resp), 0, $addr, $port); echo "Send data: $resp<br>"; } while ($read < 0); socket_close ($sock);?> Page 9 UDP 프로그램예제 (3/5) udp_client.php <?PHP $addr = gethostbyname ('127.0.0.1'); $port = 5090; $data = "Apple Orange Banana Pear"; $buf1 = ""; $sock = socket_create (AF_INET, SOCK_DGRAM, 0); if ($sock < 0) die (strerror ($sock)); $ret = socket_sendto ($sock, $data, strlen ($data), 0, $addr, $port); echo "Send data: $data<br>"; do { $read = socket_ recvfrom ($sock, $buf1, 2048, 0, $addr, $port); } while ($read < 0); echo "Receive data: $buf1<br>"; socket_close ($sock);?> Page 10 5
UDP 프로그램예제 (4/5) 실행결과 Page 11 UDP 프로그램예제 (5/5) 주의 : php_sockets.dll 활성화할것 Page 12 6
TCP (Transmission Control Protocol) (1/5) TCP 란? 연결지향형 (connection oriented) 통신프로토콜이며, 안전한 (reliable) 데이터전송을보장해주는프로토콜 서버에서클라이언트의연결을기다리는서버소켓이있으며클라이언트는미리정해진포트를통해서서버와연결 한번연결된후에는소켓을통해데이터를계속해서송수신할수있음 전송되는데이터는신뢰성이보장되어순서에상관없이데이터를전송받아도이를재조합하여정확한데이터를보내고받을수있음 UDP와다른점은서버쪽에서연결을기다린다는것임 Page 13 TCP (Transmission Control Protocol) (2/5) TCP 란? ( 계속 ) listen() 함수를이용하여클라이언트쪽에서 socket_connect() 함수가올때까지서버는기다리고, socket_connect() 함수가도착하면 socket_accept() 를보낸후데이터전송을시작함 socket_close() 함수를이용하여연결을종료함 TCP에서 socket_create() 설정시 type 파라미터는 SOCK_STREAM을사용함 Page 14 7
TCP (Transmission Control Protocol) (3/5) TCP 수행 ( 접속 ) 절차 클라이언트 create() 서버 create() bind() connect() listen() accept() write() read() read() write() Page 15 TCP (Transmission Control Protocol) (4/5) Listen (socket_listen()): 클라이언트로부터 Connection 을기다리는역할 int socket_listen (resource socket, int backlog) Connect (socket_connect()): 클라이언트가서버와연결하기위해사용 int socket_connect (resource socket, string address [, int port]) Accept (socket_accept()): 서버쪽에서연결을받아들일때, 클라이언트로 accept 메시지를전송 int socket_accept (resource socket) Page 16 8
TCP (Transmission Control Protocol) (5/5) Read (socket_read()): 데이터를받을때사용 int socket_read (resource socket_des, string buffer, int length [, int type]) Write (socket_write()): 데이터를보낼때사용 int socket_write (resource socket_des, string &buffer, int length) Page 17 TCP 프로그램예제 (1/6) TCP 프로그램예제 ( 앞서의 UDP와마찬가지로 ) 클라이언트는단어들을서버에전송하고, 서버에서이를정렬하여다시클라이언트에전송하는프로그램 서버사이드 : tcp_server.php 소켓을생성 (socket_create) 하고, 바인딩 (socket_bind) 한후, 클라이언트의접속을기다리다 (socket_listen), 접속요청이오면수락 (socket_accept) 하고, TCP로클라이언트에서보낸데이터를수신 (socket_read) 하고, 이를단어순으로정렬 (preg_split, sort) 한후, 다시서버로송신 (socket_write) 한다. Page 18 9
TCP 프로그램예제 (2/6) 클라이언트사이드 : tcp_client.php 소켓을생성 (socket_create) 하고, 서버에접속 (socket_connect) 한후, TCP 로서버에단어들을송신 (socket_write) 하고, 서버에서정렬된순서의단어들을수신 (socket_read) 한다. Page 19 TCP 프로그램예제 (3/6) tcp_server.php <? $address = "127.0.0.1"; $port = 5071; if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) == FALSE) echo "socket_create() failed: reason:". socket_strerror(socket_last_error()). "<br>"; if(socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1) == FALSE) echo "socket_set_option() failed: reason:". socket_strerror(socket_last_error()). "<br>"; if (socket_bind ($sock, $address, $port) == FALSE) echo "socket_bind() failed: reason:". socket_strerror(socket_last_error()). "<br>"; if (socket_listen ($sock, 0) == FALSE) echo "socket_listen() failed: reason:". socket_strerror(socket_last_error()). "<br>"; if (($msgsock = socket_accept ($sock)) == FALSE) echo "socket_accept() failed: reason:". socket_strerror(socket_last_error()). "<br>"; Page 20 10
TCP 프로그램예제 (4/6) tcp_server.php ( 계속 ) if(($buf = socket_read ($msgsock, 2048)) == FALSE) echo "socket_read() failed: reason:". socket_strerror(socket_last_error()). "<br>"; echo "Receive data: $buf<br>"; $temp = preg_split ("/\s+/", $buf); sort ($temp); for ($i = count ($temp) - 1; $i >= 0; $i--) $talkback.= ($temp[$i]. " "); if(socket_write ($msgsock, $talkback, strlen ($talkback)) == FALSE) echo "socket_write() failed: reason:". socket_strerror(socket_last_error()). "<br>"; echo "Send data: $talkback<br>"; socket_ close ($msgsock); socket_close ($sock);?> Page 21 TCP 프로그램예제 (5/6) tcp_client.php <? $address = "127.0.0.1"; $service_port = 5071; $socket = socket_create (AF_INET, SOCK_STREAM, 0); if ($socket == FALSE) echo "socket_create() failed: reason:". socket_strerror(socket_last_error()). "<br>"; if(socket_connect ($socket, $address, $service_port) == FALSE) echo "connect() failed: reason:". socket_strerror(socket_last_error()). "<br>"; $in = "Apple Orange Banana Pear"; if(socket_write ($socket, $in, strlen ($in)) == FALSE) echo "connect() failed: reason:". socket_strerror(socket_last_error()). "<br>"; echo "Send data: $in<br>"; if(($out = socket_read ($socket, 2048)) == FALSE) echo "connect() failed: reason:". socket_strerror(socket_last_error()). "<br>"; echo "Receive data: $out<br>"; socket_close ($socket);?> Page 22 11
TCP 프로그램예제 (6/6) 실행결과 Page 23 Homework #12 ( 실습 #10) Page 24 12