더 많은 양의 데이터를 받으려고하면 잘리고 나머지 데이터를 가져 오려면 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
'파이썬' 카테고리의 다른 글
파이썬 Python : 나누기 소수점 제거 (0) | 2021.01.13 |
---|---|
파이썬에서 wav 파일을 재생하는 방법? (0) | 2021.01.12 |
파이썬 Finding Proper Nouns using NLTK WordNet (0) | 2021.01.12 |
파이썬 Numpy Vector (N,1) dimension -> (N,) dimension conversion (0) | 2021.01.12 |
파이썬에서 if / elif 문에 대한 대안은 무엇입니까? (0) | 2021.01.12 |
댓글