c - 监听多个端口并接受连接

标签 c server httprequest

这是我的代码示例。我创建了两个套接字,打开了两个端口并尝试接受连接。我所有的文件描述符都设置为 NONBLOCK

文件描述符fd_client_serv 用于在端口 8080 上接受 HTTP GET 请求。

文件描述符 fd_client_comm 用于在我的服务器上从端口 9090 的客户端接受命令。

当我发送 HTTP 请求时,我想读取请求并简单地打印第一行。但有时有效,有时无效。服务器运行时,我正在使用 curl 发送请求。有时服务器会继续打印消息,有时则不会。我猜测是双 accepting 有问题。

你能帮我一些忙吗?

while(1)
{
    if((fd_client_serv = accept(fd_serv, (struct sockaddr *) &client_serv_addr, &sin_len_serv)) != -1)
    {
        new_fd = fd_client_serv;
        fd_set_blocking(new_fd, 0);
    }
    if((fd_client_comm = accept(fd_comm, (struct sockaddr *) &client_comm_addr, &sin_len_comm)) != -1)
    {
        temp = fd_client_comm;
        fd_set_blocking(temp, 0);
    }

    if (temp != 0)
    {
        if (server_commands(fd_comm, temp, start_time) == 1)
            break;
    }
    if (new_fd != 0)
    {
        i = 0;
        while ((bytes_read = read(new_fd, &(message[i]), 1)) != -1)
        {
            if (message[i] == '\n')
                break;
            i++;
        }
        printf("%s\n", message);
        write(new_fd, "return message", 14);
        memset(message, 0, 100);
        close(new_fd);
        new_fd = 0;
    }
}

最佳答案

除非监听套接字设置为非阻塞,否则accept() 函数阻塞 直到连接被接受。即使你的监听套接字是非阻塞的,你也会有一个性能消耗的繁忙循环。因此,虽然每次循环迭代调用两次 accept() 并不是本质上错误,但您不太可能使它们一起良好地工作。

相反,请考虑以下替代方案之一:

  • fork 一个单独的子进程来处理您的应用程序服务的每个端口,或者
  • 用单独的线程为每个端口服务,或者
  • 使用 select()poll() 或类似的多路 I/O 处理来处理多个端口和/或多个并发客户端。

关于c - 监听多个端口并接受连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417368/

相关文章:

c - 服务器绑定(bind)导致错误 "Cannot assign requested address"?

java - Android URL 连接 java.io.FileNotFoundException

web-services - 无法使用证书 : Trace log obtained (error 500) 进行身份验证

c - 我需要在 c 中使用 getopt 将目录作为命令行参数获取

c++ - Qt 5 和 QProcess 使用信号/槽 readyRead 重定向标准输出

找不到C文件

java - 服务器端 EOFException

encryption - 是什么导致 XOR 加密返回 "blank"?

c - 测试单链表性能时出现AddressSanitizer错误

http - REST:HTTP header 或请求参数