【发布时间】:2018-06-30 06:31:25
【问题描述】:
我编写了这个 Python 代码的 sn-p 代码(使用 pybluez)通过 L2CAP 发送原始 BNEP 蓝牙数据包。目的是做一些类似 fuzzing 的测试。
BNEP_PSM = 0x000F
btSock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
btSock.connect(('<some BDADDR>', BNEP_PSM))
for i in range(10):
btSock.send('<some payload>')
即使负载格式不正确,这也能正常工作并按预期创建多个 BNEP 数据包。
现在,我正在尝试使用 Qt 在 C++ 中编写相同的函数,但它的工作方式不同。代码摘录如下:
QBluetoothSocket btSock(QBluetoothServiceInfo::L2capProtocol);
btSock.connectToService(QBluetoothAddress("<some BDADDR>"), QBluetoothUuid::Bnep);
QObject::connect(&btSock, &QBluetoothSocket::connected, [&btSock](){
int i = 10;
while (i--)
btSock.write("<some payload>");
});
使用i = 1 运行它可以很好地发送具有指定负载的单个数据包。
使用i = 10 运行它会产生一个单个数据包,其负载等于指定负载的十倍。
例如,在 3 的循环中设置“AAAA”的有效负载将导致第一种使用 Python 的情况
+------------+----+ +------------+----+ +------------+----+
|L2CAP Header|AAAA| --> |L2CAP Header|AAAA| --> |L2CAP Header|AAAA|
+------------+----+ +------------+----+ +------------+----+
在第二种情况下使用Qt
+------------+------------+
|L2CAP Header|AAAAAAAAAAAA|
+------------+------------+
如何强制 Qt 套接字的 write 表现得像 Python 套接字的 send?
更新:
查看它说的文档
当控制返回事件循环时写入字节
如何在返回事件循环之前强制缓冲区刷新?
【问题讨论】:
标签: python c++ qt sockets bluetooth