파이썬(Python)/화이트해킹,침투테스트(Hack,Penetration)

Python 버퍼보다 큰 데이터 주고받기 (패킷 보내기, 받기)

끄적끄적아무거나 2021. 8. 7. 10:17
반응형

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

 

 

 

 

반응형