【问题标题】:C-code, simple web server (Code OK)C 代码,简单的 Web 服务器(代码 OK)
【发布时间】:2014-10-01 12:21:24
【问题描述】:

我的网络服务器代码有问题

#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, "hello world\n", 12);    
      close(new_socket);    
   }    
   close(create_socket);    
   return 0;    
}

这是一个创建 Web 服务器的小代码,它在 15000 端口回复“hello wordl”。现在我希望我的服务器在请求(例如)“http://127.0.0.1:15000/luigi”时回复文本“luigi”,即“/”之后的短语。谢谢!

【问题讨论】:

  • 有什么问题?问题是什么?
  • 这段代码没问题!但我会在写例如“127.0.0.1:15000/start”时用 / 后面的短语回复。清楚了吗?
  • 如果我写“127.0.0.1:15000/luigi”回复 luigi(在监视器上)。如果我写“127.0.0.1:15000/finish”回复完成(在监视器上)
  • write中写“127.0.0.1:15000....”有什么需要。你能告诉我吗?
  • 你为什么不使用像libonion这样的HTTP服务器库? HTTP 是一个实现起来相当复杂的协议!或者至少 strace 一些 simple 网络服务器....

标签: c linux networking web


【解决方案1】:

recv函数之后,你会得到类似

的东西
GET /luigi HTTP/1.1

buffer。这是浏览器发送的请求。
GET 之后的文本是您的基本地址 (127.0.0.1:15000) 的相对 URL。现在你可以解析缓冲区并做任何你想做的事情。你可以去http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html了解更多细节。

【讨论】:

  • 问题是“/”之后的文本是随机的。我希望我的代码使用相同的文本(在 / 之后)回复(在监视器上)。我希望清楚
  • 问题是“/”后面的文字是随机的,但是网络服务器会回复“/”后面的文字。我希望清楚
  • 无论“/”之后的文本是什么,它都会在浏览器发送的请求中出现在“GET”关键字之后。试试 "printf("%s", buffer);"在“recv”函数之后,它将帮助您理解请求格式。
【解决方案2】:

要加起来user3864685所说的,你可以使用'strtok'函数来获取“GET /”之后的字符串。

【讨论】:

  • -1。这不是一个好的答案形式,这更像是一个评论。
  • 我的声誉不是“50”,所以我无法评论某人的回答。请不要在不知道问题的情况下投票,这很烦人!我只是想提供一些额外的信息,无法发表评论。
  • 好吧,我猜是公平的。然后您应该删除或编辑此答案以提高其质量。除非编辑答案(这是 SO 政策/设计,这不是我的决定),否则我无法删除反对票。
猜你喜欢
  • 2023-03-24
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多