2016-03-29 2 views
2

Я хочу создать программу (сетевой сервер-клиент). Один из спецификации для этой программы в следующем:.Уникальный генератор строк

Сервер получает отправленные пакеты и сохранить его в файл с уникальным именем (генерируется сервером в момент начала передачи Ex __tf_ "unique_random_string ».txt

Я сделал функцию, которая возвращает указатель на„уникальную“строку созданного

проблема в том.. Если я остановить сервер, а затем запустить его снова, он будет генерировать те же имена

Ex: имена файлов были сгенерированы, а затем я остановился d сервер.

__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

Неопределенное поведение присутствует в коде. 'file_name [16]' _isn't действительный индекс_. Вы выделяете байт «16», поэтому индексирование должно быть от «0 до 15» и оставить индекс '15', если вы передадите' file_name' функции строковой манипуляции. – ameyCU

+0

Не могли бы вы объяснить больше. Я не понимаю, что вы хотите сказать. –

+0

Не могли бы вы помочь мне в этом. Я уже много часов работал в Интернете, и я не нашел хорошего решения. –

ответ

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.

+0

После многих тестов. Я удалил эту функцию, и я использовал ваш совет. Я думаю, что это лучшее решение для систем unix, которые я думаю. –

2

Один из вариантов сохранения в файл имена, которые были использованы, и использовать их в качестве контрольного списка. Вы также хотите семена rand с чем-то вроде srand(time(NULL)).

другой игнорирует рандомизацию и просто идет в порядке, например. aaa, aab aac ... aba, abb и т. д. Опять же, сохраните, где ваш цикл находится в файле.

+0

Эта функция srand может быть правильным ответом. Я тестировал его, и я думаю, что проблема решена. Я надеюсь, что он больше не появится –

+0

srand не решит его самостоятельно - он будет останавливать цикл rand() от начала в одной и той же точке каждый раз, но, как уже отмечалось, теоретически вы можете получить тот же код второй раз, не проверив, что он не был использован. – Orangesandlemons

1

Ваш вопрос, кажется, немного непонятно, но если вы хотите создать уникальную строку Есть несколько вещей, которые вы можете рассмотреть следующие вопросы:

  1. Get System TIMESTAMP (гггг-мм-дд-HH-мм- сс-FFF-тт)
  2. Использование случайных функций для генерации случайных чисел

в сочетании с функцией, и я уверен, что вы получите уникальную строку.

Надеюсь, это поможет!

+1

Здравствуйте. Я использовал функцию srand, и теперь она работает. Спасибо за ваше время. –

0

Перед вызовом rand(), --- один раз и только один раз, вызовите srand (время()) для инициализации генератора случайных чисел.

Прежде чем опираться на какое-либо конкретное имя файла, вызовите stat(), чтобы убедиться, что имя файла еще не существует.