是否可以使用 lex 扫描/解析来自套接字的数据?我该如何定义套接字?应该是 SOCK_STREAM 吗?我是否需要对我的 YY_INPUT 宏做任何花哨的事情,例如定义一个 select() 循环以确保解析器有数据?
谢谢
如果您使用的是 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 字符的事实有关,而且它不相信你把它们放在那里。
您可以尝试fdopen(3)
使用 a SOCK_STREAM
,即 TCP 套接字(您不能在 UDP 套接字上真正做到这一点,因为您永远不会得到 a EOF
),尽管使用带有stdio(3)
流的套接字很容易出现问题,因为自动双缓冲(在内核中)并在流中)。
您可以考虑滚动您自己的流,fmemopen(3)
或者,如果您在 Linux 上,甚至可以使用fopencookie(3)
.