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()
来自哪里?
我正在尝试从 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()
来自哪里?