在后台运行一个简单的c Web服务器

时间:2015-11-05 05:54:16

标签: c server

我有一个简单的代码充当Web服务器(只接受来自URL的请求)。以下是从here

获取的代码
#include<netinet/in.h>    
#include<stdio.h>    
#include<stdlib.h>    
#include<sys/socket.h>    
#include<sys/stat.h>    
#include<sys/types.h>    
#include<unistd.h>    

int main() {    
   int create_socket, new_socket;    
   socklen_t addrlen;    
   int bufsize = 1024;    
   char *buffer = malloc(bufsize);    
   struct sockaddr_in address;    

   if ((create_socket = socket(AF_INET, SOCK_STREAM, 0)) > 0){    
      printf("The socket was created\n");
   }

   address.sin_family = AF_INET;    
   address.sin_addr.s_addr = INADDR_ANY;    
   address.sin_port = htons(15000);    

   if (bind(create_socket, (struct sockaddr *) &address, sizeof(address)) == 0){    
      printf("Binding Socket\n");
   }


   while (1) {    
      if (listen(create_socket, 10) < 0) {    
         perror("server: listen");    
         exit(1);    
      }    

      if ((new_socket = accept(create_socket, (struct sockaddr *) &address, &addrlen)) < 0) {    
         perror("server: accept");    
         exit(1);    
      }    

      if (new_socket > 0){    
         printf("The Client is connected...\n");
      }

      recv(new_socket, buffer, bufsize, 0);    
      printf("%s\n", buffer);    
    write(new_socket, "HTTP/1.1 200 OK\n", 16);
    write(new_socket, "Content-length: 46\n", 19);
    write(new_socket, "Content-Type: text/html\n\n", 25);
    write(new_socket, "<html><body><H1>Hello A</H1></body></html>",46);   
      close(new_socket);    
   }    
   close(create_socket);    
   return 0;    
}

当我运行它时,我没有得到终端控制。

如何在后台运行它以便我的终端返回?

我遵循了一些建议:

  • $ ./sample& amp;
  • $ ./sample& amp; &GT; / dev / null
  • $ nohup ./sample&amp;

但所有这些都与 $ ./sample

具有相同的效果

有些建议是关于使用fork但我不知道如何实现它。

感谢一些帮助。

1 个答案:

答案 0 :(得分:2)

我猜你在Linux上

  

我遵循了一些建议:

 $ ./sample &
 $ ./sample & > /dev/null
 $ nohup ./sample &
     

但所有这些都与$ ./sample

具有相同的效果

你确定吗?你应该在终端上得到一个shell提示符(你不会只用./sample命令)。当然,您不应该输入$,而是shell prompt

关于fork,我们没有时间在答案中解释它(理解起来很棘手)。花几个小时或几天阅读Advanced Linux Programming或其他一些Unix或POSIX编程书的几个章节,并阅读fork(2)

您可以考虑使用daemon(3)(内部会调用fork(2) ...)和syslog(3)(特别是如果您将noclose作为0传递或falsedaemon

也许您可以使用

开始main
int main(int argc, char**argv) {    
 int create_socket= -1, new_socket= -1;    
 socklen_t addrlen =0;    
 int bufsize = 1024;    
 char *buffer = malloc(bufsize);
 if (!buffer) { perror("malloc buffer"); exit(EXIT_FAILURE); };
 if (argc > 1 && !strcmp(argv[1], "-d")) {
    printf("daemonizing...\n"); fflush(NULL);
    if (daemon(/*nochdir*/true, /*noclose*/true)) 
      { perror("daemon failed"; exit(EXIT_FAILURE); };
    printf("daemonized, pid %d\n", (int)getpid());
 }

因此,当您运行./sample -d时,它将自我守护,即将服务器作为守护程序(分叉)进程运行。

顺便说一句, 完整 HTTP协议非常复杂 (超过一百页指定)。您可以考虑使用某些HTTP服务器库,例如libonion

不要忘记编译所有警告&amp;调试信息(gcc -Wall -Wextra -g)并使用调试器(gdb),也可能stracevalgrind ......

PS。实际上,您需要ten years来学习编程。复制一些随机下载的C代码并盲目地编辑它是恕我直言(并可能会损害您的系统)。你应该很清楚程序在做什么。