1 / 22

Mi-Jung Choi Department of Computer Science Kangwon National University, Korea

네트워크 프로그래밍. Mi-Jung Choi Department of Computer Science Kangwon National University, Korea. 소켓 (Socket) (1/2). 네트워크 프로그래밍. Socket 이란 ? 서버와 클라이언트가 서로 특정한 규약을 사용하여 데이터를 전송하기 위한 방식 서버와 클라이언트는 소켓 연결을 기다렸다가 소켓이 연결되면 서로 데이터를 전송 현재 네트워크 상에서의 모든 통신의 근간은 Socket 이라 할 수 있음. 소켓 (Socket) (2/2).

ulema
Download Presentation

Mi-Jung Choi Department of Computer Science Kangwon National University, Korea

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 네트워크 프로그래밍 Mi-Jung Choi Department of Computer Science Kangwon National University, Korea

  2. 소켓 (Socket) (1/2) 네트워크 프로그래밍 • Socket 이란? • 서버와 클라이언트가 서로 특정한 규약을 사용하여 데이터를 전송하기 위한 방식 • 서버와 클라이언트는 소켓 연결을 기다렸다가 소켓이 연결되면 서로 데이터를 전송 • 현재 네트워크 상에서의 모든 통신의 근간은 Socket이라 할 수 있음

  3. 소켓 (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) 자세한 내용은 네트워크 프로그래밍 시간에 학습하세요.

  4. UDP (User Data Protocol) (1/3) 네트워크 프로그래밍 • UDP란? • 비연결형(connectionless) 통신 프로토콜로서, 비교적 간단한 네트워크 프로그래밍을 할 때 사용함 • 패킷에 데이터를 실어서 보내는데 데이터를 보내기 전에 서버와 연결을 하기 위한 작업이 생략됨 • 데이터 전송에 대한 신뢰성을 보장하지 않기 때문에 전송 중에 패킷을 잃어버릴 수 있음 • UDP socket_create()에서 type 파라미터는 SOCK_DGRAM을 사용

  5. UDP (User Data Protocol) (2/3) 네트워크 프로그래밍 • UDP 수행(접속) 절차 클라이언트 서버 create() create() bind() sendto() recvfrom() recvfrom() sendto()

  6. 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 버전 등에 따라 달라질 수 있음에 유의하세요.

  7. UDP 프로그램 예제 (1/5) 네트워크 프로그래밍 • UDP 프로그램 예제 • 클라이언트는 단어들을 서버에 전송하고, • 서버에서 이를 정렬하여 다시 클라이언트에 전송하는 프로그램 • 서버 사이드: udp_server.php • UDP로 클라이언트에서 보낸 데이터를 수신(socket_recvfrom)하고, • 이를 단어순으로 정렬(preg_split, sort)한 후, • 다시 서버로 송신(socket_sendto)한다. • 클라이언트 사이드: udp_client.php • UDP로 서버에 단어들을 송신(socket_sendto)하고, • 서버에서 정렬된 순서의 단어들을 수신(socket_recvfrom)한다.

  8. 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); ?>

  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); ?>

  10. UDP 프로그램 예제 (4/5) 네트워크 프로그래밍 • 실행 결과

  11. UDP 프로그램 예제 (5/5) 네트워크 프로그래밍 • 주의: php_sockets.dll 활성화할 것

  12. TCP (Transmission Control Protocol) (1/5) 네트워크 프로그래밍 • TCP란? • 연결지향형(connection oriented) 통신 프로토콜이며, 안전한 (reliable) 데이터 전송을 보장해 주는 프로토콜 • 서버에서 클라이언트의 연결을 기다리는 서버 소켓이 있으며 클라이언트는 미리 정해진 포트를 통해서 서버와 연결 • 한번 연결된 후에는 소켓을 통해 데이터를 계속해서 송수신할 수 있음 • 전송되는 데이터는 신뢰성이 보장되어 순서에 상관없이 데이터를 전송받아도 이를 재조합하여 정확한 데이터를 보내고 받을 수 있음 • UDP와 다른 점은 서버 쪽에서 연결을 기다린다는 것임

  13. TCP (Transmission Control Protocol) (2/5) 네트워크 프로그래밍 • TCP란? (계속) • listen() 함수를 이용하여 클라이언트쪽에서 socket_connect() 함수가 올 때까지 서버는 기다리고, socket_connect() 함수가 도착하면 socket_accept()를 보낸 후 데이터 전송을 시작함 • socket_close() 함수를 이용하여 연결을 종료함 • TCP에서 socket_create() 설정시 type 파라미터는 SOCK_STREAM을 사용함

  14. TCP (Transmission Control Protocol) (3/5) 네트워크 프로그래밍 • TCP 수행(접속) 절차 클라이언트 서버 create() create() bind() connect() listen() accept() write() read() read() write()

  15. 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 버전 등에 따라 달라질 수 있음에 유의하세요.

  16. 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 버전 등에 따라 달라질 수 있음에 유의하세요.

  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)한다.

  18. TCP 프로그램 예제 (2/6) 네트워크 프로그래밍 • 클라이언트 사이드: tcp_client.php • 소켓을 생성(socket_create)하고, 서버에 접속(socket_connect)한 후, • TCP로 서버에 단어들을 송신(socket_write)하고, • 서버에서 정렬된 순서의 단어들을 수신(socket_read)한다.

  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>";

  20. 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); ?>

  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); ?>

  22. TCP 프로그램 예제 (6/6) 네트워크 프로그래밍 • 실행 결과

More Related