【问题标题】:web server returns "broken pipe" error when constantly reloading page不断重新加载页面时,Web 服务器返回“断管”错误
【发布时间】:2021-12-10 00:51:09
【问题描述】:

我找到了最后几个错误的部分解决方案,我所做的只是创建一个线程池,而不是创建新线程并在每个连接中杀死它们。现在我没有那些奇怪的错误,但我遇到了下面列出的问题。

我在我的树莓派上使用 C 网络服务器,我能够处理多个网页请求,但是当客户端决定快速重新加载页面时,在几次重新加载后,网络服务器崩溃并且gdb 给了我错误:“broken pipe”。

这是服务器的代码:https://hastebin.com/wuzepotiko.c

我认为问题可能出在读取错误处理上,因为当我使用 gdb 时,它给了我错误:

Thread 13 "webServer" received signal SIGPIPE, Broken pipe.
[Switching to Thread 0xb161f440 (LWP 23260)]
__libc_write (nbytes=0, buf=0x22cc0 <httpResponse>, fd=7)
    at ../sysdeps/unix/sysv/linux/write.c:26
26  ../sysdeps/unix/sysv/linux/write.c: No such file or directory.

我知道这是一大堆代码,但我已经坚持了一段时间了。即使有人能指出我正确的方向,我也会非常感激!

【问题讨论】:

  • 我建议您使用 C++ 和一些现有的 Web 框架。否则,您最终会遇到支持目录遍历、缓冲区溢出等的服务器。即使使用演示质量sample code from boost 也可以为您提供稳定的起点。请注意我提供的示例 - 它使用单线程方法,因此不要在其中使用阻塞系统调用。
  • "malloc(); unsorted doublelinked list corrupted" 当函数free()在解除分配后写入内存的元数据损坏时,有时会发生这种情况。例如,在堆溢出的情况下。 Maxim 给了你一个很好的建议,但是,如果你想继续处理你的代码,我可以建议你从 GDB 发布附加信息吗?这会给我们一些线索。
  • @AmineBensalem 我不知道我可以使用调试器。一旦我能得到一些东西,我会在帖子中添加调试信息!
  • @AmineBensalem,我为其中一个错误添加了 gdb 调试信息。希望这会有所帮助。
  • @MaximSagaydachny 我想继续使用我已经拥有的代码,我很确定我将能够找到一种方法来修复目录遍历和缓冲区溢出,但无论如何感谢您的建议!

标签: c sockets raspberry-pi webserver raspbian


【解决方案1】:

我找到了问题的答案。由于 write 函数向内核发送了一个损坏的管道错误,它告诉内核退出该进程,我使用了 send 函数,它允许我阻止将信号发送到内核,现在它可以工作了!感谢所有帮助我解决问题的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多