관리 메뉴

IT창고

Network UDP 클라이언트/서버 프로그램 본문

보안/Network

Network UDP 클라이언트/서버 프로그램

방구석여포 2018. 3. 15. 20:52

네트워크프로그래밍이란?

네트워크 프로그래밍은 다른말로 소켓프로그래밍이라고도 할수있습니다.

소켓이란 입/출력을 하기위한 것으로 표준, 파일, 네트워크 입출력을 할수있습니다.

통신하려는 타입에 맞춰 소켓을 생성해서 사용합니다.


!socket family

- AF_INET/6        - ipv4로 통신 6으로하면 6으로 통신

- AF_PACKET       - raw 소켓일때 패킷타입으로 사용 


!type

- SOCK_STREAM     - tcp통신

- SOCK_DGRAM      - udp통신

- SOCK_RAW


파이썬 공식홈페이지에 socket 에 문서가 있습니다.

https://docs.python.org/3/search.html?q=socket&check_keywords=yes&area=default


네트워크 모델

- 1:1 (peer To peer 즉 p2p) 

- 1:n(server client) 


이번에는 UDP로 서버와 클라이언트 프로그래밍을 해보겠습니다.

UDP의 특징으로는 문자서비스를 비교해볼수있습니다. 송신을 하지만 수신확인이 불가능합니다.


1)서버 소켓 프로그래밍

- 클라이언트로부터 데이터를 전달 -> recv() , recvfrom()

- 해당 클라이언트한테 바로 되돌려줍니다 -> send(), sendto()

- UDP echo


간단한 UDP 통신을 확인해보겠습니다.

udp 서버를 간단히 만들어보겠습니다.

먼저 소켓을 생성하고 IP와 포트를 고정한후 recvfrom에 최대 수신가능 데이터 크기를 결정해주었습니다. 

파이썬 옵션i를 사용하여 바로 사라지지않게하고 netstat 명령어로 UDP가 열려있는 포트를 확인해보았습니다.

이제 윈도우에서 nc tool를 사용하여 데이터를 전송해보겠습니다.

Tip - Netcat(nc)는 TCP/IP를 사용하는 네트워크 연결에서 read, write가 가능한 네트워크 유틸입니다.



데이터를 192.168.1.9로 전송하게 되면 리눅스에서는 파이썬 실행기 상태로 넘어가게 되는데 이때 data변수에 어떤 값이 있는지 확인해보면 아까 윈도우에서 보낸 데이터가 들어있는걸 확인할수있습니다!

여기서 recvfrom()를 사용한 이유는 UDP에서 recv()는 누구에게 데이터가 왔는지를 알수가없지만 recvfrom()를 사용하면 어디서 데이터가 왔는지를 확인할수있습니다.


UDP 에코서버를 만들어보겠습니다.

UDP타입의 소켓을 생성하고 bind로 주소를 고정시켜준후 recvfrom()함수를 사용했습니다.

파이썬에서는 일반문자열처리를 유니코드(UTF-8)를 사용합니다. 네트워크에서는 유니코드를 사용하지않기에 아스키코드(bytes, byterray)로 변형해서 보내주어야만 합니다. 형변환은 encode(), decode()를 하여 변형하는데 즉 str.encode() , bytes.decode() 와 같습니다. 


UDP클라이언트를 간단히 만들어보겠습니다.

UDP클라이언트는 nc툴를 모델로 만들어보겠습니다.

while문부터 아래의 내용없이 더 간단히 만들어보면 sock.sendto(b'text'.(ip,port)) 와 data=sockfrom(30000)만 입력해도 테스트해볼수있습니다.

UDP통신을 확인해볼수있습니다.





Comments