c - Socket编程——服务端内容写入客户端(write())

标签 c sockets server client

我正在编写一个文件导航器,它将客户端连接到服务器并让用户列出服务器当前目录(服务器位置)中的所有文件。

假设目录包含以下文件:

test.txt
Makefile
server.c

现在,我希望用户(在客户端)能够获得服务器端所有文件/文件夹的列表。

我已经编写了一段显示所有文件的工作代码,但仅限于服务器端。它看起来如下:

void print_content(int socket_num) {
    struct dirent *entry;   //Entry
    DIR *dir_stream;    //Directory stream
    dir_stream = opendir("./"); //Open current directory
    if(dir_stream != NULL) {
        while((entry = readdir(dir_stream))) {
            printf("%s\n", entry->d_name); //Gets name
            write(socket_num, entry->d_name, 1024); //WRITE?
        }
        (void) closedir(dir_stream);
    }
    else {
        error("Problems with directory");
    }
}

如前所述,这会在服务器端正确打印出来。

但是,有没有一种方法可以轻松地将这些字符串发送到客户端,而不是使用 write() 函数?

换句话说,是否有一个函数比 write() 更类似于 printf(),它写入客户端?

最佳答案

In other words, is there a function more similar to printf() than write(), that writes to a client?

是的,有 fprintf() ,如果你先fdopen(),你可以将其用于此目的连接套接字文件描述符周围的流( FILE *)。建议您fflush()毕竟fprintf()确保最后的比特没有延迟地发送,并且绝对在丢弃流之前发送。

但是,您可能不想这样做。 [ f ] printf()用于格式化数据;将其发送到选定的目的地是次要的考虑因素,尽管很重要。除非您描述的客户端非常瘦,否则您可能希望客户端而不是服务器执行格式化。在这种情况下,您需要做的是序列化一个 struct dirent 的 [需要的部分]。 ,然后将那些发送给客户端,让它随心所欲地使用。如果您只是通过套接字传递格式化数据,那么客户端除了吸收所有传入数据并按原样在 UI 中吐出外,无能为力。唯一和永远。这或多或少就是我所说的“极度瘦弱”。

此外,如果您确实创建了一个流,请注意当您关闭它时,您也将关闭底层套接字。另一方面,如果您不关闭它就丢弃它,那么这将构成资源泄漏。

关于c - Socket编程——服务端内容写入客户端(write()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873470/

相关文章:

c - 如果在多个系统调用中完成,为什么 TCP 套接字会变慢?

c - 需要帮助在 C 中获取 TCP 端口号和 IP 地址

java - 在服务器上运行 spring boot

python - 如何从一个连接接收多条消息?

go - OAuth 2 和管理服务器端的多个用户访问 token

java - 保持服务器和客户端之间的通信畅通 - Java

c - 标准 c 中奇怪的 mktime 行为

无法从另一个文件中的函数创建线程

c - 代码的时间复杂度或大O

当客户端需要数据时,Python 套接字在 socket.recv() 上保持阻塞状态