【问题标题】:How do I use a lex scanner on a socket?如何在套接字上使用 lex 扫描仪?
【发布时间】:2012-12-04 23:07:22
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c parsing sockets lex


    【解决方案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 字符有关,而且它不相信你把它们放在那里。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-23
        • 2016-06-20
        • 2014-11-22
        • 2011-09-30
        • 1970-01-01
        相关资源
        最近更新 更多