Как получить доступ к данным, записанным в сокет, не читая их

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

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

Трассировка функции в 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 с каким-то [случайным] адресом.

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

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

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

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

炸鱼薯条德里克 11.06.2019 15:55

Если это сокеты AF_INET или AF_INET6 (TCP или UDP), то такие инструменты, как Wireshark и Скрипач, чрезвычайно полезны для отладки этого типа проблем. Wireshark позволяет вам видеть, что происходит в пакетах. Fiddler полезен, если ваш протокол основан на HTTP и может отображать полную историю запросов/ответов даже для зашифрованных соединений HTTPS.

Philip Couling 11.06.2019 16:23

Внутри сокета почти наверняка ничего не происходит. Хотя технически возможно, что вы обнаружили ошибку в ядре Linux, помните, что Linux используется на сотнях миллионов машин, и большинство из них зависит от сети. Таким образом, шанс найти ошибку, которая изменяет данные внутри сокета, очень маловероятен. Шанс, что вы допустили ошибку в своем собственном коде, весьма вероятен.

Philip Couling 11.06.2019 16:37

Спасибо, @PhilipCouling. Использование Wireshark было хорошей идеей. Я проверю это, если это поможет. Поскольку связь происходит на локальном хосте, будет использоваться Wireshark с петлевым адресом. Я также признаю ваш второй комментарий.

Sahitya Gupta 11.06.2019 17:01

Да, есть. Ищите MSG_PEEK флаг recv(2). Полезно ли это для отладки вашей программы — совсем другой вопрос, и это весьма сомнительно. Ваш «сервер» должен иметь возможность обрабатывать искаженные данные вместо того, чтобы идти в рекурсивное путешествие или взрывать стек, как это, по-видимому, происходит.

mosvy 11.06.2019 20:52

Я голосую за закрытие этого вопроса, потому что на него, похоже, ответили. В комментариях и ответ.

X Tian 12.06.2019 11:53

Опубликуйте минимальный воспроизводимый пример вашего сервера и клиента, чтобы мы могли воспроизвести проблему и помочь вам отладить ее.

user3629249 12.06.2019 22:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Это, конечно, то, что нужно исправить, но обязательно ответ на вопрос. ОП считает, что сбой вызван неправильными полученными данными. Программа-получатель определенно должна избегать ошибок переполнения стека при получении и анализе неверных данных (да), но защита от этого не решит проблему, если отправитель отправляет неверные данные.

Philip Couling 12.06.2019 11:30

Другие вопросы по теме