代码之家  ›  专栏  ›  技术社区  ›  shodanex

通过插座获取线路

  •  4
  • shodanex  · 技术社区  · 16 年前

    是否有libc函数可以与getline执行相同的操作,但可以使用连接的套接字而不是文件*流?

    解决方法是调用套接字上的fdopen。在这样做的时候,应该注意什么。做/不做的原因是什么?

    一个显而易见的原因是调用getline和co,但也许重写一些自定义getline是个更好的主意?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Rohit Banga    16 年前

    当您在套接字上调用read时,它可以提前返回零值。 如。

     read(fd, buf, bufsize)
    

    如果TCP套接字的内核缓冲区已满,则无法返回小于bufsize的值。 在这种情况下,可能需要再次调用read函数,除非它返回零或负的结果。

    因此最好避免stdio函数。为了可靠地获取bufsize字节,需要为read函数创建包装器,以便实现迭代的read调用。只有当无法从套接字中读取更多字节时,它才应该返回零值,就像从本地磁盘读取文件一样。

    你可以在书中找到包装纸 Computer Systems: A Programmer's Perspective 兰德尔·布莱恩特。

    源代码位于 this 地点。查找从rio_uuu开始的函数。

        2
  •  2
  •   Christopher Tarquini    16 年前

    问题是,如果您没有收到新行(\n或\r\n,取决于您的实现),程序将挂起。我将编写您自己的版本,它还调用select()来检查套接字是否仍然是可读/写的,并且没有任何错误。实际上,无法判断是否会有另一个“\n”或“\r\n”出现,因此请确保您知道来自客户机/服务器的数据是一致的。

    假设您编写了一个Web服务器,该服务器使用getline()读取头。如果攻击者简单地发送

    GET / HTTP/1.1\r\n
    This line isn't terminated: bla
    

    GetLine的调用将永远不会返回,程序将挂起。可能会消耗你的资源,最终一个任务是可能的。

        3
  •  2
  •   ndim    16 年前

    如果套接字连接到不受信任的输入,则应在任意时间段内为任意输入做好准备。

    • \前0个字符\r\n
    • 永远等待任何\r或\n
    • 任何其他可能丑陋的东西

    解决任意时间和任意数据的一种方法是在读取时提供超时,例如通过select(2),并将实际接收的数据逐字节传送到某个编写良好的状态机。

    推荐文章