220 likes | 365 Views
네트워크 프로그래밍. Mi-Jung Choi Department of Computer Science Kangwon National University, Korea. 소켓 (Socket) (1/2). 네트워크 프로그래밍. Socket 이란 ? 서버와 클라이언트가 서로 특정한 규약을 사용하여 데이터를 전송하기 위한 방식 서버와 클라이언트는 소켓 연결을 기다렸다가 소켓이 연결되면 서로 데이터를 전송 현재 네트워크 상에서의 모든 통신의 근간은 Socket 이라 할 수 있음. 소켓 (Socket) (2/2).
E N D
네트워크 프로그래밍 Mi-Jung Choi Department of Computer Science Kangwon National University, Korea
소켓 (Socket) (1/2) 네트워크 프로그래밍 • Socket 이란? • 서버와 클라이언트가 서로 특정한 규약을 사용하여 데이터를 전송하기 위한 방식 • 서버와 클라이언트는 소켓 연결을 기다렸다가 소켓이 연결되면 서로 데이터를 전송 • 현재 네트워크 상에서의 모든 통신의 근간은 Socket이라 할 수 있음
소켓 (Socket) (2/2) 네트워크 프로그래밍 • socket() 함수 (socket_create()) • 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이면 실패 (그렇지 않으면 성공) intsocket_create (intdomain, inttype, intprotocol) 자세한 내용은 네트워크 프로그래밍 시간에 학습하세요.
UDP (User Data Protocol) (1/3) 네트워크 프로그래밍 • UDP란? • 비연결형(connectionless) 통신 프로토콜로서, 비교적 간단한 네트워크 프로그래밍을 할 때 사용함 • 패킷에 데이터를 실어서 보내는데 데이터를 보내기 전에 서버와 연결을 하기 위한 작업이 생략됨 • 데이터 전송에 대한 신뢰성을 보장하지 않기 때문에 전송 중에 패킷을 잃어버릴 수 있음 • UDP socket_create()에서 type 파라미터는 SOCK_DGRAM을 사용
UDP (User Data Protocol) (2/3) 네트워크 프로그래밍 • UDP 수행(접속) 절차 클라이언트 서버 create() create() bind() sendto() recvfrom() recvfrom() sendto()
UDP (User Data Protocol) (3/3) 네트워크 프로그래밍 • Bind (socket_bind()) intsocket_bind (resourcesocket, stringaddress [, intport]) • Receive From (socket_recvfrom()) intsocket_recvfrom (resourcesocket, stringbuffer, intlength, intflag, stringaddress, intport); • Send To (socket_sendto()) intsocket_sendto (resourcesocket, stringbuffer, intlength, intflag, stringaddress, intport); • Close (socket_close()) boolsocket_close (resourcesocket) 상기함수들은 PHP 버전 등에 따라 달라질 수 있음에 유의하세요.
UDP 프로그램 예제 (1/5) 네트워크 프로그래밍 • UDP 프로그램 예제 • 클라이언트는 단어들을 서버에 전송하고, • 서버에서 이를 정렬하여 다시 클라이언트에 전송하는 프로그램 • 서버 사이드: udp_server.php • UDP로 클라이언트에서 보낸 데이터를 수신(socket_recvfrom)하고, • 이를 단어순으로 정렬(preg_split, sort)한 후, • 다시 서버로 송신(socket_sendto)한다. • 클라이언트 사이드: udp_client.php • UDP로 서버에 단어들을 송신(socket_sendto)하고, • 서버에서 정렬된 순서의 단어들을 수신(socket_recvfrom)한다.
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); ?>
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); ?>
UDP 프로그램 예제 (4/5) 네트워크 프로그래밍 • 실행 결과
UDP 프로그램 예제 (5/5) 네트워크 프로그래밍 • 주의: php_sockets.dll 활성화할 것
TCP (Transmission Control Protocol) (1/5) 네트워크 프로그래밍 • TCP란? • 연결지향형(connection oriented) 통신 프로토콜이며, 안전한 (reliable) 데이터 전송을 보장해 주는 프로토콜 • 서버에서 클라이언트의 연결을 기다리는 서버 소켓이 있으며 클라이언트는 미리 정해진 포트를 통해서 서버와 연결 • 한번 연결된 후에는 소켓을 통해 데이터를 계속해서 송수신할 수 있음 • 전송되는 데이터는 신뢰성이 보장되어 순서에 상관없이 데이터를 전송받아도 이를 재조합하여 정확한 데이터를 보내고 받을 수 있음 • UDP와 다른 점은 서버 쪽에서 연결을 기다린다는 것임
TCP (Transmission Control Protocol) (2/5) 네트워크 프로그래밍 • TCP란? (계속) • listen() 함수를 이용하여 클라이언트쪽에서 socket_connect() 함수가 올 때까지 서버는 기다리고, socket_connect() 함수가 도착하면 socket_accept()를 보낸 후 데이터 전송을 시작함 • socket_close() 함수를 이용하여 연결을 종료함 • TCP에서 socket_create() 설정시 type 파라미터는 SOCK_STREAM을 사용함
TCP (Transmission Control Protocol) (3/5) 네트워크 프로그래밍 • TCP 수행(접속) 절차 클라이언트 서버 create() create() bind() connect() listen() accept() write() read() read() write()
TCP (Transmission Control Protocol) (4/5) 네트워크 프로그래밍 • Listen (socket_listen()): 클라이언트로부터 Connection을 기다리는 역할 intsocket_listen (resourcesocket, intbacklog) • Connect (socket_connect()): 클라이언트가 서버와 연결하기 위해 사용 intsocket_connect (resourcesocket, stringaddress [, intport]) • Accept (socket_accept()):서버쪽에서 연결을 받아들일 때, 클라이언트로 accept 메시지를 전송 intsocket_accept (resourcesocket) 상기함수들은 PHP 버전 등에 따라 달라질 수 있음에 유의하세요.
TCP (Transmission Control Protocol) (5/5) 네트워크 프로그래밍 • Read (socket_read()): 데이터를 받을 때 사용 intsocket_read (resourcesocket_des, stringbuffer, intlength [, inttype]) • Write (socket_write()): 데이터를 보낼 때 사용 intsocket_write (resourcesocket_des, string &buffer, intlength) 상기함수들은 PHP 버전 등에 따라 달라질 수 있음에 유의하세요.
TCP 프로그램 예제 (1/6) 네트워크 프로그래밍 • TCP 프로그램 예제 • (앞서의 UDP와 마찬가지로) 클라이언트는 단어들을 서버에 전송하고, • 서버에서 이를 정렬하여 다시 클라이언트에 전송하는 프로그램 • 서버 사이드: tcp_server.php • 소켓을 생성(socket_create)하고, 바인딩(socket_bind)한 후, 클라이언트의 접속을 기다리다(socket_listen), 접속 요청이 오면 수락(socket_accept)하고, • TCP로 클라이언트에서 보낸 데이터를 수신(socket_read)하고, • 이를 단어순으로 정렬(preg_split, sort)한 후, • 다시 서버로 송신(socket_write)한다.
TCP 프로그램 예제 (2/6) 네트워크 프로그래밍 • 클라이언트 사이드: tcp_client.php • 소켓을 생성(socket_create)하고, 서버에 접속(socket_connect)한 후, • TCP로 서버에 단어들을 송신(socket_write)하고, • 서버에서 정렬된 순서의 단어들을 수신(socket_read)한다.
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>";
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); ?>
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); ?>
TCP 프로그램 예제 (6/6) 네트워크 프로그래밍 • 실행 결과