본문 바로가기
파이썬

파이썬 Python Socket Receive Large Amount of Data

by º기록 2021. 1. 12.
반응형

더 많은 양의 데이터를 받으려고하면 잘리고 나머지 데이터를 가져 오려면 Enter 키를 눌러야합니다. 처음에는 조금 늘릴 ​​수 있었지만 여전히 모든 것을받지는 않습니다. 보시다시피 conn.recv ()에서 버퍼를 늘 렸지만 여전히 모든 데이터를 얻지는 못합니다. 특정 지점에서 차단됩니다. 나머지 데이터를 받으려면 raw_input에서 엔터를 눌러야합니다. 어쨌든 한 번에 모든 데이터를 가져올 수 있습니까? 여기에 코드가 있습니다.

port = 7777
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('0.0.0.0', port))
sock.listen(1)
print ("Listening on port: "+str(port))
while 1:
    conn, sock_addr = sock.accept()
    print "accepted connection from", sock_addr
    while 1:
        command = raw_input('shell> ')
            conn.send(command)
                data = conn.recv(8000)
                if not data: break
                print data,
    conn.close()

 

해결 방법

 

TCP / IP는 메시지 기반 프로토콜이 아니라 스트림 기반 프로토콜입니다. 한 피어의 모든 send () 호출이 전송 된 정확한 데이터를 수신하는 다른 피어에 의한 단일 recv () 호출로 이어진다는 보장은 없습니다. 데이터 조각을 수신 할 수 있습니다. -meal, 패킷 조각화로 인해 여러 recv () 호출로 분할됩니다.

메시지 경계를 구별하기 위해 TCP 위에 고유 한 메시지 기반 프로토콜을 정의해야합니다. 그런 다음 메시지를 읽으려면 전체 메시지를 읽거나 오류가 발생할 때까지 계속 recv () 를 호출합니다.

메시지를 보내는 한 가지 간단한 방법은 각 메시지에 길이를 접두사로 지정하는 것입니다. 그런 다음 메시지를 읽으려면 먼저 길이를 읽은 다음 그만큼의 바이트를 읽습니다. 방법은 다음과 같습니다.

def send_msg(sock, msg):
    # Prefix each message with a 4-byte length (network byte order)
    msg = struct.pack('>I', len(msg)) + msg
    sock.sendall(msg)

def recv_msg(sock):
    # Read message length and unpack it into an integer
    raw_msglen = recvall(sock, 4)
    if not raw_msglen:
        return None
    msglen = struct.unpack('>I', raw_msglen)[0]
    # Read the message data
    return recvall(sock, msglen)

def recvall(sock, n):
    # Helper function to recv n bytes or return None if EOF is hit
    data = bytearray()
    while len(data) < n:
        packet = sock.recv(n - len(data))
        if not packet:
            return None
        data.extend(packet)
    return data

그런 다음 send_msg recv_msg 함수를 사용하여 전체 메시지를 보내고받을 수 있으며 네트워크 수준에서 패킷이 분할되거나 통합되는 데 문제가 없습니다.

 

참조 페이지 https://stackoverflow.com/questions/17667903

 

 

반응형

댓글