首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中过滤来自套接字的传入数据?

如何在Python中过滤来自套接字的传入数据?
EN

Stack Overflow用户
提问于 2016-07-14 18:24:21
回答 2查看 2.2K关注 0票数 1

我正在使用一个UDP套接字程序作为我的项目之一,来读取来自EEG耳机的输入数据。然后我用这些数据来控制机器人手臂中的伺服电机。我用来创建套接字和打印数据的代码运行良好。

代码语言:javascript
复制
import socket
import subprocess

UDP_IP = "169.254.110.133"
UDP_PORT = 50000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

while True:
        (data,addr) = sock.recvfrom(1024)
        print(data)

即将进入的数据是来自耳机的原始脑电数据,在终端中如下所示:

代码语言:javascript
复制
SourceTime 31972

TargetCode 1

ResultCode 0

Feedback 1

PauseApplication 0

CursorPosX 717

CursorPosY 2047

CursorPosZ 2047

这个数据有33个不同的部分,每几毫秒。数据总是按相同的顺序排列。对于我的代码,我只需要从数据中获取一些信息(TargetCode、ResultCode和反馈)。如何过滤掉这些部分并在代码中使用它们。有没有办法查找TargetCode并复制号码?或者,由于TargetCode总是在33节的流中是24的,我可以这样提取它吗?

EN

回答 2

Stack Overflow用户

发布于 2018-12-14 00:03:10

这是个老问题。您可以使用python调用在Linux套接字上应用过滤器(其他平台选择请参见下面):

代码语言:javascript
复制
sock.setsockopt(socket.SOL_SOCKET, SO_ATTACH_FILTER, filter)

然而,我们讨论的是一个编译和解析的过滤器:

SO_ATTACH_FILTER的参数是一个sock_fprog结构,定义于: 结构sock_fprog {无符号短伦;结构sock_filter *过滤器;}; SO_ATTACH_BPF的参数是由bpf(2)系统调用返回的文件描述符,必须引用BPF_PROG_TYPE_SOCKET_FILTER类型的程序。 来源:http://man7.org/linux/man-pages/man7/socket.7.html

这并不容易构建,特别是在Python上。

有几个很好的选择:

  • 使用替罪羊的attach_filter(socket, filter, interface)函数(Linux & OSX),它使用tcpdump解析过滤器,然后构建编译器过滤器并将其应用于套接字
  • 使用替罪羊的内置套接字(例如,安装sock = conf.L2socket(filter="tcp") )。这是跨平台的(甚至是Windows)。(谷歌获取更多信息)

然后,您只需传递一个过滤器,如:

代码语言:javascript
复制
host 10.0.0.1
port 80
tcp port 80 and host 10.0.0.1
host 10.0.0.1 or host 10.0.0.2 or port 80 or port 443

所有过滤器都采用BPF格式(请看Filter)

票数 0
EN

Stack Overflow用户

发布于 2016-07-14 19:09:06

这可能会有帮助。

服务器

代码语言:javascript
复制
import socket              

s = socket.socket()         
UDP_IP = "169.254.110.133"
UDP_PORT = 50000              
sock.bind((UDP_IP, UDP_PORT))        

s.listen(5)                 
while True:
   c, addr = s.accept()     
   c.send('Connected to server.')
   c.close()           

客户端

代码语言:javascript
复制
import socket               
UDP_IP = "169.254.110.133"
UDP_PORT = 50000   
s = socket.socket()         
s.connect((UDP_IP,UDP_PORT))
print (s.recv(1024))
s.close                     
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38381540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档