C:我如何在套接字上以字符串形式发送文件名列表?

C:我如何在套接字上以字符串形式发送文件名列表?,c,tcp,dirent.h,C,Tcp,Dirent.h,我试图从dirent结构中获取文件名,并将所有名称的列表作为串联字符串发送给客户端 经过几个小时的尝试后,我似乎无法正确分配内存,或者无法正确读取它,我得到了无意义的字符串,所以它一定是读取内存错误,即使我认为我在字符串后面加了“\0” 这是我到目前为止所做的 将字符串发送到客户端: void send_file_list(int socketNumber) { DIR *mydir; if ((mydir = opendir("upload")) == NULL) {

我试图从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个空格

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

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

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

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

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

==== 问题并不是说:文件名是要挤在一起还是用空格或逗号分隔。如果用空格分隔,那么包含空格的文件名呢

====
顺便问一下:函数名:
writen()
readn()
从哪里来?

您有编译时警告吗?顺便说一句,由于用于分隔文件名的
\n
导致了未定义的行为,您在服务器上多输入了一个字符。@Serge Ballesta No complie time Warnings您使用readdir()读取文件列表以获得长度,然后再次尝试readdir()处理列表。。。必须使用closedir()和opendir()关闭目录流,然后再重新使用它。第二,在计算“长度”时,不允许使用“分隔符”,例如逗号或换行符……每次尝试在第二个循环中打印“文件列表”,然后再将来自目录的新文件名附加到其中,以查看其值。另外,请注意@SergeBallesta的评论。事实上,您为每个文件名添加的字符比您分配的多,并且您也没有考虑最后的“\0”字符。问题是关于
char filelist[len]。它定义了一个可变长度数组,这是一个可选功能,一些编译器(MSVC)不支持它,只提供一个0大小的数组。您应该尝试
size\u t len=0
初始化变量(未初始化的自动变量接收未指定的值)和
len=len+strlen(entry->d_name)+1
\n
预留一些空间。witen()和readn()来自导入的文件rdwrn.c和.h,这是一个课程项目的一部分,我不完全确定它们是如何工作的,但基本上它们是从给定的套接字读写的。这个细节应该在问题的文本中提及,而不是在评论中提及。