A 正在用 C 语言编写一个客户端-服务器程序。它发送一个目录名称并接收一个文件列表作为答案。我遇到的问题是它陷入了无限循环。
如果我只发送一个目录名,它会起作用,但如果我发送一个目录列表,它永远不会结束并且不输出任何内容。
服务器
while(recv(sock, name, BUFSIZE, 0) > 0){
if ((fddir=opendir(name)) == NULL){
send(sock, strerror(errno), strlen(strerror(errno)), 0);
close(sock);
return 1;
}
send(sock, name, strlen(name), 0);
send(sock, ":", strlen(":"), 0);
send(sock, "\n", strlen("\n"), 0);
while ((dirbuf = readdir(fddir)) != NULL){
buf[0] = '\0';
strcat(buf, dirbuf->d_name);
strcat(buf, "\t");
send(sock, buf, BUFSIZE, 0);
}
}
客户端
for (int i=1;i<3;i++){
send(sock, argv[i], strlen(path), 0);
while(recv(sock, buf, BUFSIZE, 0) > 0)
printf("%s", buf);
}
服务器等待直到收到所有目录名称,然后客户端等待服务器发送其中的所有文件。如何追踪程序卡在哪里?
最佳答案
TCP 不是基于消息的,因此当您在服务器上调用 recv()
时,您无法知道两个客户端 send()
调用之间的边界在哪里。因此,当您连续发送多个名称时,服务器可以在一个 recv()
中接收所有这些名称(或者无论您为 BUFSIZE
分配多少字节) )。这可能会破坏您的目录名称,导致 opendir
失败。如果您正在检查 send
和 recv
的错误,这对您来说会更加明显,并且 Captain Obvlious 在另一个答案中进行了描述。
关于c++ - recv() 套接字循环永远不会结束 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256685/