UDP통신 파이썬 소켓 프로그래밍

2017. 6. 12. 19:03NetworkHacking/Network




소켓 : 네트워크 통신을 하기 위해서는 소켓을 사용하여야 한다


[1] UDP통신, 서버와 클라이언트의 동기화

[ 서버 ]

 import socket

 sock = socket.socket( sockt.AF_INET , socket.SOCK_DGRAM)     // 소켓을 생성한다

 sock.bind( ('192.168.2.179',8080) )                                  // 서버의 아이피와 포트번호를 고정

 data , addr = sock.recvfrom( 200 )                                 // 데이터 수신 대기 ( 최대 수신가능 데이터의 크기 200byte )

                                                                              //  => 반환값 : ( 데이터 , (IP주소, PORT번호) )

 print ( " Server is received data : " , data.decode() )           // 받은 데이터 출력

 print ( " Send Client IP : " , addr[0] )                             // 보내온 클라이언트의 아이피주소 출력 

 print ( " Send Client Port : ", addr[1] )                           // 보내온 클라이언트의 포트번호 출력 ( 랜덤번호 )



[ 클라이언트 ]

 import socket

 sock = socket.socket( socket.AF_INET , socket.SOCK_DGRAM )            // 소켓을 생성한다   

 sock.sendto( "Hello".encode() , ('100.100.100.110',8080) )                    // Hello 문자열을 인코딩해서 서버에게 보낸다



[실행결과]

[서버에서 받은 데이터를 출력한 결과]

[ 그림 2 ]


같은 서버에서 작업해서 IP주소가 똑같이 나왔습니다.

다른 서버에서 해당 작업을 실행하였다면, 서버IP주소는 다르게 출력되었을겁니다.

클라이언트에서 포트번호는 랜덤으로 적용되서 서버의 8080포트로 데이터가 들어옵니다




[2] UDP통신 응용

- 클라이언트에서 입력한 데이터를 서버에게 무한 송신하고 서버는 무한 수신

[서버]

 import socket

 sock = socket.socket( socket.AF_INET , socket.SOCK_DGRAM )

 sock.bind( ('100.100.100.110',8080) )

 while True:

     data , addr = sock.recvfrom ( 200 )

     print ( " Server is received data : " , data.decode() )

     print ( " Send Client IP : " , addr[0] )

     print ( " Send Client Port : ", addr[1] )

     print ( " Server return data to " , addr[0] )



[클라이언트]

 import socket

 sock = socket.socket( socket.AF_INET , socket.SOCK_DGRAM )

 while True:

     data = input()

     sock.sendto( data.encode() , ('100.100.100.110',8080) )



[실행결과]

[서버에서 받은 데이터를 출력한 결과]

[ 그림2 ]


무한으로 데이터를 수신하고 있는 서버의 모습입니다

클라이언트의 파이썬 파일을 종료하고 다시 시작해보았더니, 포트번호가 변경되어짐을 알 수 있습니다

클라이언트의 포트번호는 랜덤으로 생성되어집니다 ( bind를 하지 않았기 때문 )




[3] 에코서버

- 클라이언트에서 서버에게 입력한 데이터를 보내면 서버에서는 다시 클라이언트에게 해당 데이터를 돌려보내준다

[서버]

 import socket

 sock = socket.socket( socket.AF_INET , socket.SOCK_DGRAM )

 sock.bind( ('100.100.100.110',8080) )

 while True:

     data , addr = sock.recvfrom ( 200 )

     sock.sendto( data , addr )

     print ( " Server is received data : " , data.decode() )

     print ( " Send Client IP : " , addr[0] )

     print ( " Send Client Port : ", addr[1] )

     print ( " Server return data to " , addr[0] )



[클라이언트]

 import socket

 sock = socket.socket( socket.AF_INET , socket.SOCK_DGRAM )

 while True:

     data = input()

     sock.sendto( data.encode() , ('100.100.100.110',8080) )

     data , addr = sock.recvfrom( 200 )

     print ( "Client send and recieved data : ", data.decode() )

     print ( "data from IP : ", addr[0] )

     print ( "data from PORT : ", addr[1] )



[실행결과]

[ 서버에서 받은 데이터를 출력한 결과 ]

[ 그림3 ]


클라이언트의 포트번호가 재접속해서 데이터를 보내보면 바뀌어서 데이터가 들어옴을 알 수있습니다

에코서버는 서버로 들어온 클라이언트의 정보를 이용해서 클라이언트에게 받은 데이터를 그대로 돌려주는 통신상태입니다


[클라이언트 실행한 결과]

[ 그림4 ]


서버의 포트번호는 그대로 일정함을 알 수 있습니다. 이는 bind()메서드를 통해서 서버의 아이피와 포트번호를 고정시켜주었기 때문입니다


# 참고 #

서버의 포트번호가 랜덤으로 바뀌면 데이터를 제대로 전송할 수 가 없겟죠?

클라이언트의 포트번호가 랜덤으로 바뀌는 것은 정보안전을 위한 예방차원입니다