执笔的人 2024-06-01 19:42 采纳率: 33.3%
浏览 4
已结题

在云服务器上部署的http服务器,为什么在浏览器不能访问啊

在云服务器上部署的http服务器,为什么在浏览器不能访问啊,目的是用来测试的,在网址上显示一个“hello world”
源代码

img


这是执行的命令

img


访问页面

img

云服务器安全组设置 用的是阿里的

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-01 19:42
    关注

    引自免费微信小程序:皆我百晓生

    从您提供的信息来看,您的HTTP服务器似乎没有正确配置或启动,导致无法通过浏览器访问。下面我会按照步骤帮您排查问题。

    首先,让我们确认一下服务器端的程序是否有错误。您的代码看起来像是C语言编写的简单HTTP服务器,但是有些部分可能需要调整。以下是优化过的代码版本:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    #define BUFFER_SIZE 1024
    
    void Usage() {
        printf("usage: ./server [ip] [port]\n");
    }
    
    int main(int argc, char *argv[]) {
        if (argc != 3) {
            Usage();
            return 1;
        }
    
        int server_fd = socket(AF_INET, SOCK_STREAM, 0);
        if (server_fd < 0) {
            perror("socket");
            return 1;
        }
    
        struct sockaddr_in server_addr;
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(atoi(argv[2]));
        if (inet_pton(AF_INET, argv[1], &server_addr.sin_addr) <= 0) {
            perror("inet_pton");
            return 1;
        }
    
        int ret = bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
        if (ret < 0) {
            perror("bind");
            return 1;
        }
    
        ret = listen(server_fd, 10);
        if (ret < 0) {
            perror("listen");
            return 1;
        }
    
        while (true) {
            struct sockaddr_in client_addr;
            socklen_t len = sizeof(client_addr);
            int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len);
            if (client_fd < 0) {
                perror("accept");
                continue;
            }
    
            char inputbuf[BUFFER_SIZE] = {0};
            ssize_t read_size = recv(client_fd, inputbuf, BUFFER_SIZE - 1, 0);
            if (read_size < 0) {
                perror("recv");
                close(client_fd);
                continue;
            }
            inputbuf[read_size] = '\0'; // null terminate the string
    
            char response[BUFFER_SIZE] = {0};
            const char* hello = "<h1>Hello World</h1>";
            sprintf(response, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: %zu\r\n\r\n%s",
                    strlen(hello), hello);
    
            send(client_fd, response, strlen(response), 0);
            close(client_fd);
        }
    
        close(server_fd);
        return 0;
    }
    
    1. inet_addr替换为inet_pton,因为后者更安全。
    2. 添加了 \r\n 到响应头中,确保它们符合HTTP规范。
    3. 添加了 Content-TypeConnection: close 头部到响应中,这是HTTP标准要求的。
    4. 使用 recv 替换 read,并添加了接收结束标志\0,以确保字符串被正确终止。

    接下来,我们需要确保您的云服务器的安全组规则允许外部访问。根据您提供的截图,安全组已经允许了自定义的TCP端口(3000-20000)和所有ICMP请求。要确保HTTP服务可以正常工作,您需要添加一个新的规则,允许来自任意源的8080端口的入站流量。

    操作如下:

    1. 登录阿里云控制台。
    2. 找到您的ECS实例。
    3. 在实例详情页找到“网络与安全”标签。
    4. 点击“安全组管理”。
    5. 选择用于部署HTTP服务器的安全组。
    6. 在“授权策略”中点击“添加安全组规则”。
    7. 填写规则信息:
      • 类型:自定义TCP
      • 目的端口:输入8080
      • 源:0.0.0.0/0(表示允许任何IP地址)
      • 状态:启用
    8. 点击“确定”。

    完成上述步骤后,等待片刻让新规则生效,然后尝试再次访问您的IP地址加上8080端口号(例如:http://123.57.82.30:8080)。如果仍然无法访问,请检查服务器日志(通常位于 /var/log 目录下的某个位置),查看是否有任何错误消息。此外,您可以尝试在服务器上使用nc(netcat)工具监听端口,确认服务器是否正在监听和响应连接。

    如果您仍然遇到问题,请提供更多的信息,例如服务器日志中的输出以及任何可能的错误消息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月9日
  • 已采纳回答 6月1日
  • 创建了问题 6月1日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真