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

标签 c++ c linux unix

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/

相关文章:

c++ - Protocol Buffers (protobuf) v3.0.0-alpha-2 中的可选字段和约束

c++ - Visual Studio 对静态库进行单元测试;防止主项目中出现额外的依赖项

C++如何从输入的字母或数字中输出字母或数字

c - #C,输入总工资并得到净收入的程序

c++ - 使用 const & 打印出列表

c++ - 如何创建一个类,其成员变量包含唯一指针,可复制分配?

c - 互斥锁内的信号量等待

linux - 从父文件夹和所有子文件夹中删除特定的命名目录

linux - 从 osx 编译 matlab 代码以在 linux 上运行

python - docker py : PermissionError(13)