如何在套接字上使用lex扫描仪?

时间:2012-12-04 23:07:23

标签: c parsing sockets lex

是否可以使用lex扫描/解析套接字中的数据?我该如何定义套接字?应该是SOCK_STREAM吗?我是否需要对YY_INPUT宏执行任何操作,例如定义select()循环以确保解析器有数据?

由于

2 个答案:

答案 0 :(得分:1)

如果您正在使用flex,则可以将YY_INPUT重新定义为您想要的任何内容。

它应该是这样的:

#define YY_INPUT(buf,result,max_size)  \
read up to max_size characters into buf \
result = (read worked) ? (number of characters read) : YY_NULL;

即使你在内存中的某个角色,你也必须将它们复制到buf。这有点烦人,但它与flex在每个输入块的末尾需要两个NUL字符的事实有关,并且它不相信你把它们放在那里。

答案 1 :(得分:0)

您可以在SOCK_STREAM上尝试fdopen(3),即TCP套接字(由于您永远不会获得EOF,因此无法在UDP套接字上执行此操作),虽然使用带有stdio(3)流的套接字很容易出问题,因为自动双缓冲(在内核和流中)。

您可以使用fmemopen(3)来查看自己的流,或者,如果您使用的是Linux,甚至是fopencookie(3)