|
|
1
3
当您在套接字上调用read时,它可以提前返回零值。 如。
如果TCP套接字的内核缓冲区已满,则无法返回小于bufsize的值。 在这种情况下,可能需要再次调用read函数,除非它返回零或负的结果。 因此最好避免stdio函数。为了可靠地获取bufsize字节,需要为read函数创建包装器,以便实现迭代的read调用。只有当无法从套接字中读取更多字节时,它才应该返回零值,就像从本地磁盘读取文件一样。 你可以在书中找到包装纸 Computer Systems: A Programmer's Perspective 兰德尔·布莱恩特。 源代码位于 this 地点。查找从rio_uuu开始的函数。 |
|
|
2
2
问题是,如果您没有收到新行(\n或\r\n,取决于您的实现),程序将挂起。我将编写您自己的版本,它还调用select()来检查套接字是否仍然是可读/写的,并且没有任何错误。实际上,无法判断是否会有另一个“\n”或“\r\n”出现,因此请确保您知道来自客户机/服务器的数据是一致的。 假设您编写了一个Web服务器,该服务器使用getline()读取头。如果攻击者简单地发送
GetLine的调用将永远不会返回,程序将挂起。可能会消耗你的资源,最终一个任务是可能的。 |
|
|
3
2
如果套接字连接到不受信任的输入,则应在任意时间段内为任意输入做好准备。
解决任意时间和任意数据的一种方法是在读取时提供超时,例如通过select(2),并将实际接收的数据逐字节传送到某个编写良好的状态机。 |