Python 버퍼보다 큰 데이터 주고받기
앞서 포스트에서 socket을 이용해서 간단하게 packet을 주고 받았다. 동일 컴퓨터에서 server와 client를 만들어서 간단한 문장을 네트워크 연결 후에 전달하였다. TCP 프로토콜로 주고 받았는데 해당내용은 괄호 안에 링크를 참조하길 바란다. (https://scribblinganything.tistory.com/247)
만일 주고받고자 하는 데이터가 파일이거나 용량이 큰 메세지일 경우 그것에 대비해서 무작정 큰 버퍼를 사용하는 것은 자원 낭비이다.
이번장에서 구현할 코드는 보낼 패킷에 패킷의 크기 정보를 같이 보내서 받는 쪽에서 거기에 맞춰어 패킷이 다 들어올때까지 기다리는 형태로 구현 할 것이다. 이 아이디어는 일반적인 네트워크 프로토콜에서 가져왔다. 네트워크 프로토콜을 살펴보면 각 층마다 헤더(Header)를 가지고 있고 헤더에는 길이(Length) 정보가 포함되어 있다.
구현하기
코드 - 서버측>>
import socket
Length_header_size = 8
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 8080))
s.listen(5)
while True:
c_socket, client_ip = s.accept()
packet = f"Hi, Client ip and port : {client_ip}"
packet = f"{len(packet):<{Length_header_size}}"+packet
print("sending packet : ", packet)
c_socket.send(bytes(packet,"utf-8"))
코드 - 클라이언트측>>
import socket
Length_header_size = 8
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 8080))
combined_packet = ""
new_packet = True
while True:
while True:
packet = s.recv(16)
combined_packet = combined_packet + packet.decode("utf-8")
if new_packet:
packet_length = int(packet[:Length_header_size])
new_packet = False
if len(combined_packet)-Length_header_size == packet_length:
print(combined_packet[Length_header_size:])
new_packet = True
break
결과 - 서버측>>
sending packet : 49 Hi, Client ip and port : ('192.168.0.111', 32971)
결과 - 클라이언트측>>
Hi, Client ip and port : ('192.168.0.111', 32971)
주석>>
packet = s.recv(16)
위 코드처럼 클라이언트의 buffer 사이즈는 16바이트이다. 하지만 그 이상 크기의 데이터가 들어왔다. 하지만 먼저 들어온 헤더 정보를 통해 앞으로 들어올 패킷 사이즈 정보를 알고 있기 때문에 모든 메세지를 받을 수 있었다.
while True:
while True:
두번의 while 문을 사용한 이유는 패킷을 받은 후 네트워크 연결을 계속 유지 하기 위해 사용하였다.
packet = f"{len(packet):<{Length_header_size}}"+packet
서버쪽 코드에서 위와 같이 < (꺽쇠)를 사용한 이유는 정렬과 빈칸을 채우기 위해서 이다. 해당 동작을 더 자세히 알고 싶다면 아래 링크를 참조하길 바란다.
https://scribblinganything.tistory.com/248
'파이썬(Python) > 화이트해킹,침투테스트(Hack,Penetration)' 카테고리의 다른 글
Python NMAP 포트스캐너 만들기(wireshark로 결과 확인하기) (0) | 2021.08.15 |
---|---|
Python Socket 만으로 포트 스캐너 만들기(Port Scanner) (0) | 2021.08.13 |
python socket이란? AF_INET, SOCK_STREAM 의미, 간단하게 텍스트 주고 받는 서버 만들기 (0) | 2021.08.04 |
Python으로 wifi 주소 확인하고 비밀번호 입력하여 연결하기 (윈도우 환경) (0) | 2021.08.01 |
Python으로 wifi 주소 확인하고 연결하기 (윈도우 환경) (0) | 2021.07.31 |