【问题标题】:What is wrong with this "simple-http-server" program (c code)这个“simple-http-server”程序有什么问题(c代码)
【发布时间】:2011-01-01 03:52:34
【问题描述】:

以下是我编写的一段简单代码,用于演示 HTTP 服务器的工作原理。 我编译它在 cygwin 下运行它,但我无法使用 Web 浏览器连接到这个简单的 http 服务器。并且运行简单的http服务器后,我仍然可以在80端口运行apache,如果apache没有运行,“netstat -an”显示80端口没有被占用。

我编写了另一个简单的程序,它向简单的 http 服务器发送一个简单的“hello”字符串,然后得到响应。

  1. 这个程序有什么问题?为什么我不能用网络浏览器连接它,但我可以用另一个简单的程序连接它?

  2. 端口何时被占用?在“绑定”或“监听”之后?

  3. 如果一个应用程序正在使用特定网络接口的端口(例如 192.168.2.1:80,假设存在多个网络接口),另一个应用程序是否可以在另一个接口上使用相同的端口(例如 192.168.55.1 :80)?

  4. 运行httpd时,进程列表中有多个httpd进程,只有一个使用0.0.0.0:80,如果使用cygwin apache,其他httpd使用其他UDP端口?为什么?

#include "stdio.h" #include "stdlib.h" #include "string.h" #include "sys/types.h" #include "sys/socket.h" #include "netinet/in.h" #include "netdb.h" #include "unistd.h" #include "fcntl.h" #define PORT 80 char HttpHeader[1000]; char HeaderTemplate[] = "HTTP/1.0 200 OK\r\n" "Server: PRIMITIVE Server\r\n" "Date: %s\r\n" "Content-Type: text/html\r\n" "Accept-Ranges: bytes\r\n" "Content-Length: %d\r\n\r\n"; char PageContent[] = "Hello World!"; char GMTNow[] = "11/15/14 00:59:00 GMT"; char ClntRequest[1000]; struct sockaddr_in SocketAddress; int ClntDescriptor; /* socket descriptor to client */ int SrvrDescriptor; /* socket descriptor for server */ int main(int argc, char* argv[]) { sprintf(HttpHeader, HeaderTemplate, GMTNow, strlen(PageContent)); SrvrDescriptor = socket(AF_INET, SOCK_STREAM, 0); SocketAddress.sin_family = AF_INET; SocketAddress.sin_port = PORT; SocketAddress.sin_addr.s_addr = INADDR_ANY; bind(SrvrDescriptor, (struct sockaddr*)&SocketAddress, sizeof(SocketAddress)); listen(SrvrDescriptor, 5); ClntDescriptor = accept(SrvrDescriptor, 0, 0); while (1) { recv(ClntDescriptor, ClntRequest, sizeof(ClntRequest), 0); printf("%s\n", ClntRequest); write(ClntDescriptor, HttpHeader, strlen(HttpHeader)); write(ClntDescriptor, PageContent, strlen(PageContent)); printf("%s", HttpHeader); printf("%s", PageContent); } close(SrvrDescriptor); return EXIT_SUCCESS; }

【问题讨论】:

  • 2.如果端口已在使用中,您将收到来自绑定调用的错误返回。

标签: http sockets


【解决方案1】:

端口的字节顺序不正确,

SocketAddress.sin_port        =  htons (PORT);

【讨论】:

    【解决方案2】:
    1. 这个程序有什么问题?为什么我不能用网络浏览器连接它,但我可以用另一个简单的程序连接它?

      您的端口很可能需要按网络字节顺序排列。使用 htons(PORT)。

    2. 端口何时被占用?在“绑定”或“听”之后? 绑定后。

    3. 如果一个应用程序正在使用特定网络接口的端口(例如 192.168.2.1:80,假设存在多个网络接口),另一个应用程序是否可以在另一个接口上使用相同的端口(例如 192.168.55.1 :80)? 是的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2015-02-23
      相关资源
      最近更新 更多