我意识到我会得到至少一个答案,就像“(重新)编写代码所以它不会挂起”但我们假设我们并没有生活在那个闪亮的快乐乌托邦中......
在我们的嵌入式系统中,我们有一个很棒的SDK,包括一个Web服务器(Boa),这是用户交互的主要方法。
在月球的某些阶段,某些可能会导致Web服务器挂起或以其他方式卡住,以使进程正常运行(不会崩溃/死机/使用) 100%CPU)但不提供任何网页。
所以,问题是,我们如何测试/检测这种情况?
答案 0 :(得分:2)
要测试服务器是否挂起,请创建TCP套接字并连接到IP地址80
上的端口127.0.0.1
(环回地址)。然后通过套接字发送以下文本
GET / HTTP/1.1\r\n\r\n
大多数服务器会将其解释为index.html
的请求。或者,您可以实现一个未记录的URL进行测试(允许更短的预定响应),例如
GET /test/fdoaoqfaf12491r2h1rfda HTTP/1.1\r\n\r\n
然后,您需要从服务器读取响应。这涉及使用具有合理超时的select
来确定是否有任何数据从服务器返回,如果是,请使用recv
来读取数据。来自服务器的响应将包含一个标题,后跟内容。标题由文本行组成,标题末尾有一个空行。行以\r\n
结尾,因此标题的结尾为\r\n\r\n
。
获取内容涉及调用select
和recv
,直到recv
返回0.这假定服务器将发送响应然后关闭套接字。一些复杂的服务器将打开套接字以允许通过同一套接字的多个请求。一个简单的嵌入式服务器不应该这样做。 (如果您的服务器 尝试为多个请求使用相同的套接字,那么您需要弄清楚如何关闭该功能。)
这一切都非常好,但你真的需要重写你的代码,所以它不会挂起。
问题的最可能原因是服务器有一堆悬空套接字,即来自客户端的连接从未正确清理过。悬空套接字最终会阻止服务器接受更多连接,因为服务器对打开的连接数有限制,或者因为运行服务器的进程占用了所有文件描述符。
要检查的第一件事是TCP超时值。我工作的一个项目默认超时为5小时,这意味着悬挂的插座保持打开5个小时。合理的超时是1分钟。
然后你需要创建一个故意行为不端的客户端。
客户可能行为不端第一种情况应该由TCP超时处理。另外两个需要由服务器代码正确处理。通过ioctl
和shutdown
函数的SO_LINGER选项控制优雅和突然的套接字闭包。客户端在服务器进程中行为不端check the number of open file descriptors后,验证服务器是否已正确处理该情况。