1

是否可以使用 lex 扫描/解析来自套接字的数据?我该如何定义套接字?应该是 SOCK_STREAM 吗?我是否需要对我的 YY_INPUT 宏做任何花哨的事情,例如定义一个 select() 循环以确保解析器有数据?

谢谢

4

2 回答 2

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 字符的事实有关,而且它不相信你把它们放在那里。

于 2012-12-05T03:39:42.810 回答
0

您可以尝试fdopen(3)使用 a SOCK_STREAM,即 TCP 套接字(您不能在 UDP 套接字上真正做到这一点,因为您永远不会得到 a EOF),尽管使用带有stdio(3)流的套接字很容易出现问题,因为自动双缓冲(在内核中)并在流中)。

您可以考虑滚动您自己的流,fmemopen(3)或者,如果您在 Linux 上,甚至可以使用fopencookie(3).

于 2012-12-04T23:45:20.697 回答