Как получить доступ к данным, записанным в сокете, не читая их - PullRequest
0 голосов
/ 11 июня 2019

Я работаю над встроенной системой с Linux.Клиентский поток записывает некоторые данные в сокет, но то, что серверный поток читает с другой стороны, отличается от того, что было записано.Что приводит к сбою потока (и родительского процесса).

Я новичок в сети и Linux.Я сбросил каждый фрагмент данных, который записывается, все нормально.

Функция trace в gdb показывает следующую информацию.

(gdb) 
#0  0x00007f62be8e8670 in getenv () from /lib/libc.so.6
#1  0x00007f62be92057a in __libc_message () from /lib/libc.so.6
#2  0x00007f62be99f927 in __fortify_fail () from /lib/libc.so.6
#3  0x00007f62be99f8f0 in __stack_chk_fail () from /lib/libc.so.6
#4  0x0000000000406471 in reading (sockFd=15) at __line_number_in_the_program__
#5  0x793bcf318b18bb01 in ?? ()
#6  0x117d0300942ff567 in ?? ()
#7  0x0000000100000000 in ?? ()
..
..
..

Идет до # 785 с некоторыми [random] address.

чтение () - это функция, которая обрабатывает прочитанные данные в потоке сервера.

Я подозреваю, что внутри сокета что-то идет не так.Есть ли способ увидеть данные, которые находятся в буфере сокетов (клиент / сервер), не читая их?Или любой другой способ отладки с помощью gdb?

Уже есть некоторые проверки для правильной обработки прочитанных данных, но они также не помогают.

1 Ответ

1 голос
/ 12 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...