是否可以使用lex扫描/解析套接字中的数据?我该如何定义套接字?应该是SOCK_STREAM吗?我是否需要对YY_INPUT宏执行任何操作,例如定义select()循环以确保解析器有数据?
由于
答案 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)
。