2016-12-05 2 views
0

Я пишу программу на языке C для класса передачи данных. Я пытаюсь реализовать выборочный отказ между клиентом и сервером. Сообщение закодировано.Запись в сокет вызывает ошибку сегментации, если строковый массив скопирован

В моем клиенте я создаю массив char, называемый hamming_buffer, который содержит фрейм с заголовками, управляющими символами и закодированными данными. Чтобы реализовать выборочный отказ, я должен отслеживать некоторое количество кадров. Для этого я сохраняю кадры в массив строки, называемый window_buffer.

strcpy(frame_buffer,sync); //make the first two characters in the frame SYNC 
    strcpy(frame_buffer+8,sync); 
    char *window_buffer[DEFAULT_FRAME_SIZE]; //default frame size is 64, global to main 
    char frame_buffer[DEFAULT_FRAME_SIZE*8]={'0'} 
    ... 
    char hamming_buffer[hammingBytesInData*8+24]; //declared within the innermost loop 

Когда я пытаюсь сохранить текущий кадр, а затем записать в сокет, я получаю сообщение об ошибке сегментации

//window_buffer[frame_counter%DEFAULT_WINDOW_SIZE]=hamming_buffer; //add hamming buffer to window_buffer 
//memcpy(window_buffer[frame_counter%DEFAULT_WINDOW_SIZE],hamming_buffer,(int)sizeof(hamming_buffer)/sizeof(char)); 
strncpy(window_buffer[frame_counter%DEFAULT_WINDOW_SIZE],hamming_buffer,sizeof(hamming_buffer)/sizeof(hamming_buffer[0])); 
//some code to introduce errors into the frame 
write(sockfd,hamming_buffer,(sizeof(hamming_buffer)/sizeof(hamming_buffer[0]))); 

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

Я занимался подобными проблемами в этом проекте, но у этого есть я, почесывающий голову. Мое лучшее предположение, что я каким-то образом сбиваю память, которая используется hamming_buffer при заполнении window_buffer.

Любое, что я делаю неправильно здесь.

Мне нужен мой код для записи в сокет без повреждения сегментации.

+1

Покажите, как вы устанавливаете записи 'window_buffer'. Возможно, вы можете попытаться написать неинициализированный указатель. Очень сложно отладить неполный код. Укажите [MCVE]. – kaylum

+0

Как заполнять буфер окна уже включен во второй блок кода. Вы имеете в виду, как я заполняю эти данные в первую очередь (например, как я заполняю буфер помех?) –

+0

Отладчик должен точно указать, какая строка вызвала segfault, и вы можете проверить любые значения переменных. – e0k

ответ

0

У вас есть 64-длинный массив char * Вы не выделили места для хранения буфера, на который может указывать указатель. Если массив является локальным, он хранится в стеке и не инициализирован, поэтому значения указателя не определены. Если массив является статическим или внешним, то все они равны нулю. В идеале при попытке копирования первого байта вы получите ошибку сегментации. Но вы, вероятно, копируете на страницу, на которую у вас есть привилегия писать, развращать другие данные или даже сам код, если они доступны для записи и не отделяются от данных. В любом случае, когда вы пытаетесь отправить поврежденный фрейм с поврежденным кодом, вы вызываете ошибку сегментации.

Вы должны сначала назначить память для кадров, которые вы хотите сохранить. Существует три варианта:

  1. Вы malloc пространство, такое же, как и рамка (возможно, освобождение первого или просто перераспределение старого пространства кадра).
  2. Вы объявляете двумерный массив с подходящим размером для максимальной длины кадра, с которой вы не справитесь. Легкая, но менее эластичная и растрачивающая память. Также неплохо, если это автоматическая переменная в стеке.
  3. Вы заполняете пространство для буфера, а затем просто назначаете его позиции массива вместо копирования. Это самый оптимальный способ, если он подходит вашим потребностям.
+0

Это похоже на другую ошибку, которую я должен был исправить с помощью этого проекта. На моем сервере я должен создать буфер для хранения фреймов. Однако в этом случае это были отдельные кадры, которые должны были быть malloc'd. Я пытался избежать этого, но похоже, что я могу быть в этой лодке. –

+0

Каждый элемент 'window_buffer' является указателем на' char'. Вы должны выделить буфер для каждого из них, иначе вы пишете, где вы не должны, когда пытаетесь написать им. – e0k

Смежные вопросы