我想制作一个程序(网络服务器 - 客户端)。 下一个是该程序的规范之一:
服务器将接收发送的包并将其保存到一个文件中,该文件具有唯一的名称(在传输开始时由服务器生成)。 Ex __tf _" unique_random_string" .txt
我做了一个函数,返回一个指向" unique"的指针。字符串创建。
问题是:如果我停止服务器然后再次启动它将生成相同的名称。
例如:生成了这个文件名,然后我停止了服务器。
__ ft_apqfwk.txt
__ ft_arzowk.txt
__ ft_cdyggx.txt
我再次启动它,我尝试生成3个文件名。他们将是一样的。
抱歉我的英文。我还在学习它。
我的功能是生成这个"唯一字符串"是:
char *create_random_name(void)
{
const char charset[] = "abcdefghijklmnopqrstuvwxyz";
char *file_name;
int i=0;
int key;
if((file_name = malloc(16 * sizeof ( char )) ) == NULL)
{
printf("Failed to alloc memory space\n");
return NULL;
}
strcpy(file_name,"__ft_");
for(i=5 ; i<11 ; i++)
{
key = rand() % (int)(sizeof(charset)-1);
file_name[i]=charset[key];
}
strcat(file_name,".txt");
file_name[15] = '\0';
return file_name;
}
答案 0 :(得分:2)
一种选择是将已使用的名称保存到文件中,并将其用作清单。你还想用srand(time(NULL))
之类的东西来种子兰特。
另一个是忽略了随机化,只是顺序排列,例如aaa,aab aac ... aba,abb等。再次,保存你的周期所在的文件。
答案 1 :(得分:1)
您的问题似乎有点不清楚,但如果您想要生成一个独特的字符串,您可以考虑以下几个方面:
将此功能与您的功能相结合,我相信您将获得一个独特的字符串。
希望它有所帮助!
答案 2 :(得分:0)
如果它可用,您可以避免手动生成可能发生冲突的随机名称,并让系统为您执行此操作(并通过使用mkstemps
创建新名称来处理冲突解决)。这也更安全,因为它会为您打开文件,消除生成随机名称,验证为唯一的风险,然后尝试打开它并发现另一个参与的线程/进程并创建它。
char name[] = "/path/to/put/files/in/__ft_XXXXXX.txt";
int fd = mkstemps(name, strlen(".txt"));
if (fd == -1) { ... handle error ... }
mkstemps
成功后,name
将保留文件的路径(它已就位变异,替换XXXXXX
字符串),fd
将是一个打开的文件描述符到新创建的文件;如果您需要FILE*
,请使用fdopen
转换为stdio
类型。
答案 3 :(得分:0)
在调用rand(),---一次且仅一次---之前,调用srand(time())来初始化随机数生成器。
在确定任何特定文件名之前,请调用stat()以确保文件名尚不存在。