这是我的代码示例。我创建了两个套接字,打开了两个端口并尝试接受连接。我所有的文件描述符都设置为 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/