0

我正在为我的OpenWrt路由器用C 语言编写一个自定义 HTTP 服务器。它利用了uclibc库。我只使用一个静态缓冲区,我非常小心不要溢出,并且不涉及多线程。它不包含任何复杂的数据结构,它的作用是:

  • 它在套接字上侦听()
  • 在accept()之后读取请求
  • 通过向预定义的远程服务器(不是代理)发送 http 请求来获取 html 页面
  • 通过接受的连接发送结果,并关闭两者。

该程序会在一段时间后停止运行(它可以在收到第一个请求时,或者在重压下工作超过 2 小时后)。我没有通过控制台或任何东西收到错误消息,程序只是停止了。我看过它,正如预期的那样,它在运行时不会消耗越来越多的内存......

  • 如果内核认为它滥用CPU,它是否有可能停止它?我该如何克服呢?
  • 在 C 中的套接字编程中是否存在一些已知会导致此类崩溃的怪癖?
  • 使用 OpenWrt 的 Barrier Bracker (bleeding edge) 分支是否会导致稳定性问题?虽然路由器本身永远不会停止工作......

我从哪里开始寻找问题的根源?

4

2 回答 2

1

好的,首先,我要感谢大家的帮助。在写了很多netcat测试器之后,我已经查明了问题所在。如果连接在最后一次写入或读取发生之前被客户端关闭,程序将崩溃而没有一条错误消息。写入或读取会引发SIGPIPE信号,如果不手动处理,默认情况下会导致程序崩溃...更多信息:如何防止 SIGPIPE 或防止服务器结束?

于 2014-05-21T10:24:42.493 回答
0
This seems to be similar to what your trying to do, 
as shown on http://www.cs.rpi.edu/~moorthy/Courses/os98/Pgms/socket.html
Is this socket setup the same/similar to what your performing in your code?


/* A simple server in the internet domain using TCP
   The port number is passed as an argument */
#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

void error(char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno, clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);
     n = write(newsockfd,"I got your message",18);
     if (n < 0) error("ERROR writing to socket");
     return 0; 
}
于 2014-05-21T09:21:36.020 回答