C: 我怎样才能将文件名列表作为字符串发送到套接字上?

C: How could I send a list of file names as a string on a socket?

我正在尝试从 dirent 结构中获取文件名,并将所有名称的列表作为连接字符串发送给客户端。

经过几个小时的尝试,我似乎无法正确分配内存或正确读取它,我得到了无意义的字符串,所以它一定是读取内存错误,即使我想我已经附加了字符串 "\0"

这是我到目前为止所做的,

向客户端发送字符串:

void send_file_list(int socketNumber)
{

    DIR *mydir;
    if ((mydir = opendir("upload")) == NULL) {
    perror("error");
    exit(EXIT_FAILURE);
    }

    struct dirent *entry = NULL;

    size_t len;

    //loop through entry to get size of all filenames as string.
    while ((entry = readdir(mydir)) != NULL)
    {
    len = len + strlen(entry->d_name);
    }

    char filelist[len];

    //returns NULL when dir contents all processed
    while ((entry = readdir(mydir)) != NULL)
    {
    strcat(strcat(filelist, entry->d_name),"\n");
    }

    closedir(mydir);

    size_t n = len;

    writen(socketNumber, (unsigned char *) &n, sizeof(size_t)); 
    writen(socketNumber, (unsigned char *) filelist, n);

    printf("Sent file list of size %zu bytes\n",n);

}//end send_file_list()

从服务器获取字符串:

void get_file_list(int socket)
{
    size_t k;

    readn(socket, (unsigned char *) &k, sizeof(size_t));
    char filelist[k];   
    readn(socket, (unsigned char *) filelist, k);

    printf("Received: %zu bytes\n\n", k);
    printf("\n---Files On Server -------------------\n");
    printf("%s", filelist);
    printf("\n--------------------------------------\n"); 

} // end get_file_list()

witen() 和 readn() 来自导入文件,rdwrn.c 和 .h,这是课程作业项目的一部分,我不完全确定它们是如何工作的,但基本上它们是读写的从给定的套接字。不是我做的。

我已经搞了几个小时了,我觉得越来越乱了。有更好的方法吗?

这个循环:

while ((entry = readdir(mydir)) != NULL)
{
len = len + strlen(entry->d_name);
}

有几个问题。

1) 整个贴出的代码通用,缩进不一致。为了保持一致性,在每个左大括号“{”之后缩进。在每个右大括号“}”之前取消缩进。建议每个缩进级别为 4 spaces.

2) 目录条目中的条目种类繁多。 (链接、子目录等)

在结果字符串中包含任何特定的 'file name' 之前。代码需要检查条目的类型以确保它是一个普通文件并且文件名不是 . 也不是 ..

==== 变量:len 未初始化,建议使用:

size_t len = 0;

==== 请注意,函数 strlen() returns 字符串末尾 NUL 字节的偏移量(偏移量从 0 开始,而不是 1),因此实际长度长 1 个字节

==== 问题没有说明:此代码是仅收集当前目录文件名还是将文件名包含在子目录中?

==== 问题没有说明:文件名是挤在一起还是用 space 或逗号分隔。如果用 space 分隔,包含 space 的文件名怎么办?

==== 顺便说一句:函数名称:writen()readn() 来自哪里?