【发布时间】:2014-08-04 15:53:16
【问题描述】:
我正在尝试使用 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);
}
}
由于某种原因,当客户端关闭连接时,即使使用if-break 子句,程序也会继续打印-1:..
【问题讨论】:
-
如果'n'是-1,你应该调用perror(),或者在错误信息中使用strerror[],并且你应该不将它用作数组索引测试它。