在基于 fork() 的服务器中监听 UDS 和 TCP 套接字的正确方法是什么?
What is the correct way to listen to both UDS and TCP sockets in a `fork()` based server?
我正在写一个基于 fork()
的服务器,TCP 套接字是客户端与服务器的通信通道,而 UDS 套接字(数据报,如果它有任何区别)是一个通信通道管理控制台与服务器。
监听两种套接字类型的正确方法是什么?我的服务器目前看起来很像 Beej 示例中的 fork()
服务器:
while(1) { // main accept() loop
sin_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == -1) {
perror("accept");
continue;
}
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
s, sizeof s);
printf("server: got connection from %s\n", s);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
if (send(new_fd, "Hello, world!", 13, 0) == -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
如何在上面的代码中添加监听和等待 UDS 套接字(已经绑定)中的连接的能力。
使用 select()
、poll()
或 epoll()
(epoll()
假设 Linux。)
或者使用多线程。
我正在写一个基于 fork()
的服务器,TCP 套接字是客户端与服务器的通信通道,而 UDS 套接字(数据报,如果它有任何区别)是一个通信通道管理控制台与服务器。
监听两种套接字类型的正确方法是什么?我的服务器目前看起来很像 Beej 示例中的 fork()
服务器:
while(1) { // main accept() loop
sin_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == -1) {
perror("accept");
continue;
}
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
s, sizeof s);
printf("server: got connection from %s\n", s);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
if (send(new_fd, "Hello, world!", 13, 0) == -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
如何在上面的代码中添加监听和等待 UDS 套接字(已经绑定)中的连接的能力。
使用 select()
、poll()
或 epoll()
(epoll()
假设 Linux。)
或者使用多线程。