gpt4 book ai didi

c++ - recv() 套接字循环永远不会结束 C

转载 作者:太空狗 更新时间:2023-10-29 11:38:24 25 4
gpt4 key购买 nike

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 失败。如果您正在检查来自 sendrecv 的错误并且 Captain Obvlious 在另一个答案中描述,这对您来说会更明显。

关于c++ - recv() 套接字循环永远不会结束 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256685/

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