gpt4 book ai didi

c - 按照 Beej 的网络编程指南实现聊天客户端

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:40 27 4
gpt4 key购买 nike

我正在尝试通过关注 Beej's guide 来学习网络编程.我编译了the server in section 7.2 ,那是使用 select(),现在我正在尝试为该服务器编写一个客户端,这样我就可以在我的机器上打开两个终端并能够聊天。

我从 client he gives as an example in section 6.2 开始,我可以看到,如果我连接到 localhost,服务器会接受连接,所以我从那里开始。

我所做的是在接受到服务器的连接后立即编辑部分(在 freeaddrinfo(servinfo);//all done with this structure 之后),这是代码的一部分我已经添加了。

while (1) {

FD_ZERO(&readfds);
FD_ZERO(&writefds);

FD_SET(STDIN, &readfds);
FD_SET(sockfd, &writefds);

fcntl(STDIN, F_SETFL, O_NONBLOCK);

if (select(sockfd+1, &readfds, &writefds, NULL, NULL) < 0) {
close(sockfd);
perror("client: select");
exit(1);
}

if (FD_ISSET(sockfd, &writefds)) { // got data from socket, write it to console
numbytes = recv(sockfd, buf, MAXDATASIZE, 0);
buf[numbytes] = '\0';
printf("%s\n", buf);
}

if (FD_ISSET(STDIN, &readfds)) { // got data from stdin, write it to socket
fgets(buf, MAXDATASIZE, STDIN);
send(sockfd, buf, strlen(buf), 0);
}
}

在尝试运行这段代码时,我注意到 recv() 永远不会返回。我知道这段代码远非完美,但这是我第一次使用套接字,所以我很乐意就我在这里做错了什么获得一些指导。

最佳答案

recv(2) 是一个读取操作,所以 sockfd 应该放在 readfds 而不是 writefds 中。

(顺便说一句,STDIN 来自哪里?在 POSIX 系统上,您可以使用 STDIN_FILENO。)

您已经说过这是简单的测试代码(在实践中可能会按预期工作),但以防万一您没有意识到:recv() 可能会拆分数据任意地。作为一个极端的例子,它可以一次返回一个字节。

关于c - 按照 Beej 的网络编程指南实现聊天客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036494/

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