gpt4 book ai didi

c++ - 服务器套接字在客户端关闭连接时完成

转载 作者:行者123 更新时间:2023-11-30 01:52:06 25 4
gpt4 key购买 nike

我试图用 C++ 创建一个服务器套接字,以便一次接受一个客户端连接。该程序成功创建了服务器套接字并等待传入​​连接,但是当客户端关闭连接时,程序将无限循环。否则,如果连接中断,它将按预期继续等待新连接。知道为什么会这样吗?谢谢

这是我的 C++ 服务器代码:

   int listenfd, connfd, n;
struct sockaddr_in servaddr, cliaddr;
socklen_t clilen;
pid_t childpid;
char mesg[1000];

listenfd = socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(32000);
bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

listen(listenfd, 1024);

while (true) {
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen);

if ((childpid = fork()) == 0) {
close (listenfd);

while (true) {
n = recvfrom(connfd, mesg, 1000, 0, (struct sockaddr *)&cliaddr, &clilen);
sendto(connfd, mesg, n, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

mesg[n] = 0;
printf("%d: %s \n", n, mesg);

if (n <= 0) break;
}
close(connfd);
}
}

由于某些原因,当客户端关闭连接时,程序将继续打印 -1:,即使使用 if-break 子句也是如此。

最佳答案

您永远不会在父进程中关闭 connfd(当 childpid != 0 时),并且您没有正确终止将尝试循环的子进程。你的 if block 应该是这样的:

if ((childpid = fork()) == 0) {
...
close(connfd);
exit(0);
}
else {
close(connfd);
}

但是正如您所说,您希望一次接受一个连接,您可以简单地不 fork 。

如其他答案所示:

  • 未经测试不要使用mesg[n] n >= 0
  • recvfromsendto 对 TCP 来说太过分了,只需使用 recvsend(甚至 read )

关于c++ - 服务器套接字在客户端关闭连接时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122714/

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