这个“简单的http服务器”程序有什么问题(c代码)

时间:2011-01-01 03:52:35

标签: http sockets

以下是我编写的一段简单代码,用于演示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端口?为什么?

  5. 
    #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 个答案:

答案 0 :(得分:1)

端口的字节顺序不正确,

SocketAddress.sin_port        =  htons (PORT);

答案 1 :(得分:0)

  1. 这个程序出了什么问题?为什么我无法使用网络浏览器连接它,但我可以将它与另一个简单的程序连接?

    最有可能您的端口需要处于网络字节顺序。使用htons(PORT)。

  2. 港口什么时候被占用?在“绑定”或“听”之后? 绑定后。

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