如何使用 fork 系统调用在 C++ 套接字上编写多用户 tcp 服务器
how to write multi-user tcp server on c ++ sockets using fork system call
我用 C++ 在套接字上编写服务器和客户端。我有一个服务器 运行 供一个客户使用。告诉我如何使用 fork
编写多用户服务器。
服务器:
int main() {
int server_socket = Socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adr = {0};
adr.sin_family = AF_INET;
adr.sin_port = htons(1110);
Bind(server_socket, (struct sockaddr* )&adr, sizeof(adr));
Listen(server_socket, SOMAXCONN);
socklen_t adr_len = sizeof(adr);
int res_accept = Accept(server_socket, (struct sockaddr* ) &adr, &adr_len);
while(true) {
char buffer[1024];
ssize_t count_read = Recv(res_accept, buffer, 1024, 0);
printf("%s\n", buffer);
fflush(stdin);
char res[10];
int result = words_counter(buffer);
sprintf(res, "%d\n", result);
ssize_t count_send = Send(res_accept, res, 10, 0);
}
close(res_accept);
close(server_socket);
return 0;
}
客户:
int main(int argc, char const *argv[]) {
int client_socket = Socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adr = {0};
adr.sin_family = AF_INET;
adr.sin_port = htons(1110);
Inet_pton(AF_INET, "127.0.0.1", &adr.sin_addr);
int res_connect = Connect(client_socket, (struct sockaddr* ) &adr, sizeof(adr));
while (true) {
char message[1024];
printf("input message\n");
fgets(message, 1024, stdin);
if (strncmp(message, "quit!", 5) == 0) break;
ssize_t count_send = Send(client_socket, message, 1024, 0);
char buffer[10];
ssize_t count_read = Recv(client_socket, buffer, 10, 0);
printf("SERVER: The number of words in the transmitted message: %s", buffer);
}
close(client_socket);
return 0;
}
我用的是bind
、listen
等自写的wrapper functions(为了方便错误处理)函数,所以函数名都是大写的。
谢谢你的帮助
Tell me how to use fork
to write a multiuser server.
我带你去问如何通过使用 fork
来调整你现有的服务器来服务多个客户端。最简单的方法是
对从 Accept()
调用到 close(res_accept)
的所有内容进行循环。这提供了接受多个连接。如果您只想按顺序处理多个客户端,则无需任何分叉即可完成。但是要能够同时处理多个客户端 ,
fork()
接受每个连接后。让(仅)child 执行 while
循环,然后 _exit()
。 parent 将跳过 while
循环到 close(res_accept)
。这释放了 parent 以接受更多连接,而 child 处理与 newly-accepted 客户端的交互。
我用 C++ 在套接字上编写服务器和客户端。我有一个服务器 运行 供一个客户使用。告诉我如何使用 fork
编写多用户服务器。
服务器:
int main() {
int server_socket = Socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adr = {0};
adr.sin_family = AF_INET;
adr.sin_port = htons(1110);
Bind(server_socket, (struct sockaddr* )&adr, sizeof(adr));
Listen(server_socket, SOMAXCONN);
socklen_t adr_len = sizeof(adr);
int res_accept = Accept(server_socket, (struct sockaddr* ) &adr, &adr_len);
while(true) {
char buffer[1024];
ssize_t count_read = Recv(res_accept, buffer, 1024, 0);
printf("%s\n", buffer);
fflush(stdin);
char res[10];
int result = words_counter(buffer);
sprintf(res, "%d\n", result);
ssize_t count_send = Send(res_accept, res, 10, 0);
}
close(res_accept);
close(server_socket);
return 0;
}
客户:
int main(int argc, char const *argv[]) {
int client_socket = Socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adr = {0};
adr.sin_family = AF_INET;
adr.sin_port = htons(1110);
Inet_pton(AF_INET, "127.0.0.1", &adr.sin_addr);
int res_connect = Connect(client_socket, (struct sockaddr* ) &adr, sizeof(adr));
while (true) {
char message[1024];
printf("input message\n");
fgets(message, 1024, stdin);
if (strncmp(message, "quit!", 5) == 0) break;
ssize_t count_send = Send(client_socket, message, 1024, 0);
char buffer[10];
ssize_t count_read = Recv(client_socket, buffer, 10, 0);
printf("SERVER: The number of words in the transmitted message: %s", buffer);
}
close(client_socket);
return 0;
}
我用的是bind
、listen
等自写的wrapper functions(为了方便错误处理)函数,所以函数名都是大写的。
谢谢你的帮助
Tell me how to use
fork
to write a multiuser server.
我带你去问如何通过使用 fork
来调整你现有的服务器来服务多个客户端。最简单的方法是
对从
Accept()
调用到close(res_accept)
的所有内容进行循环。这提供了接受多个连接。如果您只想按顺序处理多个客户端,则无需任何分叉即可完成。但是要能够同时处理多个客户端 ,fork()
接受每个连接后。让(仅)child 执行while
循环,然后_exit()
。 parent 将跳过while
循环到close(res_accept)
。这释放了 parent 以接受更多连接,而 child 处理与 newly-accepted 客户端的交互。