gpt4 book ai didi

c - 使用套接字从客户端读取

转载 作者:太空宇宙 更新时间:2023-11-04 07:42:29 25 4
gpt4 key购买 nike

我基本上设置了一个服务器,我正在接受新的客户端 (UNIX),我正在使用 select() 命令来等待文件描述符上的事件,但我不确定如何从客户端写入和然后在服务器端读取它

FD_ZERO(&readfds);
FD_SET(server_sockfd, &readfds);
FD_SET(STDIN_FILENO, &readfds);
while (1) {
testfds = readfds;
select(4 + MAXCLIENTS, &testfds, NULL, NULL, NULL);
for (fd = 0; fd < 4 + MAX_CLIENTS; fd++) {
if (FD_ISSET(fd, &testfds)) {
if (fd == server_sockfd) { /* new connection request */
client_sockfd = accept(server_sockfd, NULL, NULL);
if (num_clients < MAXCLIENTS) {
FD_SET(client_sockfd, &readfds);
num_clients++;
} else {
sprintf(message, "XSorry, too many clients. Try again later.\n");
write(client_sockfd, message, strlen(message));
close(client_sockfd);
}
} else if (fd == STDIN_FILENO) {
fgets(kb_message, BUFSIZ + 1, stdin);
if (strcmp(kb_message, "quit\n") == 0) {
sprintf(message, "XServer is shutting down.\n");
for (fd2 = 4; fd2 < 4 + MAX_CLIENTS; fd2++) {
if (FD_ISSET(fd2, &readfds)) {
write(fd2, message, strlen(message));
close(fd2);
}
}
close(server_sockfd);
exit(EXIT_SUCCESS);
} else {
sprintf(message, "M%s", kb_message);
for (fd2 = 4; fd2 < 4 + MAX_CLIENTS; fd2++)
if (FD_ISSET(fd2, &readfds))
write(fd2, message, strlen(message));
}
} else { /* client leaving */
close(fd);
FD_CLR(fd, &readfds);
num_clients--;
}
}
}

我将如何处理来自客户的写请求然后写回给他们,它是否在“其他”下以及我如何检查客户是退出还是写入。

谢谢

最佳答案

select(2) 最常见的错误是没有重新初始化描述符集,因为第二个、第三个和第四个参数是输入-输出参数

设置一个fd_set,用于在外循环之前读取,向其添加监听套接字描述符,进入循环,复制这个fd_set 并将副本提供给 select(2)。当新连接到达时,将其描述符添加到原始 fd_set。对于关闭的套接字(read(2) 上的错误或 EOF)也是如此 - 从 original fd_set 中删除描述符。

希望这对您有所帮助。

关于c - 使用套接字从客户端读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2368509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com