IT강의/데이터통신

소켓 프로그래밍 기초 실습 - UDP편

샤핑 2020. 12. 26. 19:18
728x90
반응형

이번에는 소켓 프로그래밍을 UDP로 실습해보겠습니다.

첫 번째 포스팅에서 언급했던 UDP를 살펴보면 다음과 같습니다.

 

UDP

- 비신뢰적 전송(unreliable transfer) 이므로 데이터 손실이 발생할 확률이 높습니다.

- 데이터 손실률이 높은 대신, 속도가 꽤 빠릅니다.

- 서로 connection 되는 과정이 존재하지 않고, 프로토콜만 같으면 어떠한 프로그램하고도 통신이 가능합니다.

 

 

이번 포스팅에서는 UDP 소켓을 이용해 통신하는 것을 기초적인 것만 실습해볼 것입니다.

실습하기 전, UDP 소켓으로 통신하는 과정을 살펴보면 다음과 같습니다.

 

 

TCP 통신에서는 connect()와 accept() 함수를 이용해 1:1로 연결되는 과정이 별도로 필요했지만,

UDP 통신에서는 이러한 과정이 필요하지 않습니다.

Client의 Flow에서 사용된 함수들입니다.

socket() : 소켓을 생성함

send() : 서버한테 메시지 또는 데이터를 전송함

recv() : 서버로부터 메시지 또는 데이터를 받음

 

Server의 Flow에서 사용된 함수들입니다.

bind() : socket에 필요한 IP주소 정보를 할당함

 

함수들의 개념과 기능은 TCP와 비슷합니다.

그렇다면, 실습에서는 어떻게 구현이 되는지 한 번 살펴보도록 하겠습니다.

 

 

소켓 프로그래밍 실습 - Python

※ 가독성을 높이기 위해 소스 코드도 일부러 이미지로 제시하였습니다. 소스 코드는 첨부파일에서 다운 받을 수 있습니다.

 

 

<UDP Client 소스 코드 (udpclient.py)>

 

socket(AF_INET, SOCK_DGRAM)

UDP 소켓을 생성합니다. 함수 두 번째 인자가 'SOCK_DGRAM' 이므로 UDP 소켓입니다.

(TCP 소켓 생성은 SOCK_STREAM, 지난 시간에 살펴보았습니다.)

 

clientSocket.sendto( sentence.encode(), (serverName, serverPort) )

UDP 방식으로 상대 측한테 메시지 또는 데이터를 전송합니다.

구체적으로 해석하자면, 'Client Message' 라는 문장을 byte 단위로 변환해준 다음, IP주소 localhost, 포트번호 12000 한테 전송하는 것입니다.

 

UDP의 경우, 1:1로 연결되는 과정이 별도로 존재하지 않는 만큼, 전송할 때마다 항상 IP주소와 포트번호를 명시해야 됩니다.

 

clientSocket.recvfrom(2048)

UDP 방식으로 상대 측으로부터 메시지를 받는 함수입니다.

최대 2048 bytes의 데이터 또는 메시지를 받아들입니다.

 

clientSocket.close()

​지난 시간에 언급했던 close() 입니다.

수명과 사용법은 똑같지만, TCP인지 UDP인지에 따라 다르게 해석할 필요가 있습니다.

TCP에서는 서버와의 연결을 끊는다는 것으로 해석하였지만,

UDP에서는 연결을 끊기보다는 소켓을 제거한다는 의미로 받아들이는 것이 좋겠습니다.

 

 

  

<UDP Server 소스 코드 (udpserver.py)>

 

serverSocket.bind((' ', serverPort))

TCP 방식과 동일합니다.

자신의 IP주소와 포트번호를 소켓한테 할당해줍니다.

 

 

결과 화면

 

 

<UDP Client>

Server가 'Server Message'를 전송하였으므로, Client 쪽에서 받아 그대로 출력하는 모습

 

 

<UDP Server>

Client가 'Client Message'를 전송하였으므로, Server 쪽에서 받아 그대로 출력하는 모습

결과화면은 지난 시간의 TCP 방식과 똑같습니다. 

Client, Server, 모두 정상적으로 잘 돌아가는 모습을 볼 수 있습니다.

 

udpclient.py
0.00MB
udpserver.py
0.00MB

 

 

<출처>

컴퓨터 네트워킹 하향식 접근 제6판, James F. Kurose.Keith W. Ross 지음, PEARSON

728x90
반응형
LIST