Я пишу программу на языке 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.
Любое, что я делаю неправильно здесь.
Мне нужен мой код для записи в сокет без повреждения сегментации.
Покажите, как вы устанавливаете записи 'window_buffer'. Возможно, вы можете попытаться написать неинициализированный указатель. Очень сложно отладить неполный код. Укажите [MCVE]. – kaylum
Как заполнять буфер окна уже включен во второй блок кода. Вы имеете в виду, как я заполняю эти данные в первую очередь (например, как я заполняю буфер помех?) –
Отладчик должен точно указать, какая строка вызвала segfault, и вы можете проверить любые значения переменных. – e0k