2017. 6. 12. 19:03ㆍNetworkHacking/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()메서드를 통해서 서버의 아이피와 포트번호를 고정시켜주었기 때문입니다
# 참고 #
서버의 포트번호가 랜덤으로 바뀌면 데이터를 제대로 전송할 수 가 없겟죠?
클라이언트의 포트번호가 랜덤으로 바뀌는 것은 정보안전을 위한 예방차원입니다
'NetworkHacking > Network' 카테고리의 다른 글
메서드를 활용한 계층별 헤더 분석 (0) | 2017.06.17 |
---|---|
스캔 프로그래밍 / 계층별 헤더 프로그래밍 (0) | 2017.06.14 |
TCP통신 파이썬 소켓 프로그래밍 (0) | 2017.06.12 |
네트워크해킹 실습환경 구축 (0) | 2017.06.08 |
OSI7 Layer , TCP/IP (0) | 2017.04.22 |