首先,您的代码实际上并不是一次发送512 个字节,而是一次接收512 个字节。
现在,我认为您实际上是在问两个问题。
- 如何通过 TCP 连接一次发送 10 个字节(您正在使用
socket.SOCK_STREAM
)
- 如何使用 Python 套接字发送原始字节。
让我们回答 2。首先:如果您在字节字符串上调用socket.send,它应该作为 TCP 有效负载以二进制形式发送出去。
对于 1.,最简单的方法是将数据拆分为块(现在您知道您正在对字符串进行操作,您可以使用切片操作简单地做到这一点(请参阅关于字符串的 Python 教程- 例如s[0:10]
,s[10:20]
等)。接下来,您需要确保这些切片是单独发送的。这可以通过调用来完成socket.send
,但问题是,即使您不希望,您的 TCP/IP 堆栈也可能将它们分组为数据包 - 毕竟您已经问过了为您提供流套接字,socket.SOCK_STREAM
. 如果您正在写入文件,在这种情况下您要做的是刷新文件,但这对于 Python 套接字似乎并不容易(请参阅此问题)。
现在,我认为这个问题的答案,说这是不可能的,并不完全正确。看起来Scapy会让你发送 10 字节的 TCP 块(我从这里得到了 chunks() 函数)。我在wireshark中检查了它并多次尝试了一致的结果,但我没有检查实现以确保这一定会发生。
您可能应该问自己为什么要以 10 个字节的块发送数据,而不是让 TCP 处理它的设计目的,并考虑使用分隔符。
无论如何,这是使用 Scapy 的代码(有趣的事实:看起来运行它不需要 root 权限):
客户:
from scapy.all import *
import socket
host = '192.168.0.x' #replace with your IP
my_port = 3002
message = "some string I want to send in chunks"
def chunks(lst, n):
"Yield successive n-sized chunks from lst"
for i in xrange(0, len(lst), n):
yield lst[i:i+n]
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, my_port))
ss=StreamSocket(client_socket,Raw)
for chunk in chunks(message, 10):
print "sending: " + chunk
ss.send(Raw(chunk) )
client_socket.close()
服务器:
import socket
my_port=3002
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", my_port))
server_socket.listen(5)
client_socket, address = server_socket.accept()
while (True):
data = client_socket.recv(512)
if (data):
print data
else:
break