【发布时间】:2018-06-14 17:07:11
【问题描述】:
我将通过python通过tcp通道发送一个字节字符串, 位串有 3 个字节“000010010000000000001001”,如果我把它看成 3 个整数,它是 '909'
发件人代码:
import socket
import struct
TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = b"000010010000000000001001"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
print( "received data:", data)
收货人代码:
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
print('Connection address:', addr)
while 1:
data = conn.recv(BUFFER_SIZE)
if not data: break
print( "received data:", data)
conn.send(data)
conn.close()
我运行程序并使用 Wireshark 捕获数据,数据包完全不同,以十六进制表示:
30 30 30 30 31 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 31
所以我不是发送字节,而是发送字符串。 hex(ord('1')) == 0x31 和 hex(ord('0')) == 0x30。
我怎样才能真正发送字节?
【问题讨论】:
-
Hrm,你确定wireshark不只是使用十六进制格式在截取点显示包内容吗?你肯定会传入字节,你肯定会再次将它们取出。最后,您的游戏负载在通过堆栈层的过程中会发生很多巫术和黑魔法。您无法完全从应用程序层控制数据在网络上的外观。
-
您收到的正是您发送的内容,因为 b"00001001" 是一个长度为 8 个字节的字节串,由 '0' 和 '1' 字符组成。