Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: C++ pipe(read()) и fgets() в одной программе, перехват данных  (Прочитано 1152 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Доброе время суток! В одной программе пришлось использовать pipeЫ и socketЫ, сокет-сервер для общения с клиентами по сети, а пайп для общения с родительским процессом. Для получение информации от клиентов в сети (сокеты) использую recv(), для получения данных с главного процесса (пайпы) использую read(). Столкнулся с такой проблемой, т.к. и сокет и пайп не блокируются и работают в цикле иногда, очень редко (что усложняет понимание глюка для меня), сталкиваюсь с тем, что при ответе клиента, непонятно почему, read() (пайп) крадет часть инфы у recv() (сокет) и соответственно я получаю ошибку, кто может сказать, направить, порекомендовать, что мне делать? Как устранить сей глюк?

Заранее спасибо!
« Последнее редактирование: 17 Марта 2016, 21:04:15 от Vlad.V »

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 754
    • Просмотр профиля
Re: C++ pipe и socket в одной программе
« Ответ #1 : 16 Марта 2016, 07:57:53 »
Без кода тут не особо поможешь. Могу предложить тебе написать просто приложение "эмулируещее" это поведение, и проверить, воспроизводится ли это в простом случае.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Re: C++ pipe и socket в одной программе
« Ответ #2 : 16 Марта 2016, 10:53:04 »
Спасибо за совет, попробую сделать так как Вы сказали, выкладывать код не вижу смысла, так как это не маленькая програмка кода много, а кому нужны чужие портянки))

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
Re: C++ pipe и socket в одной программе
« Ответ #3 : 16 Марта 2016, 13:41:00 »
Такого быть никак не должно, проверьте, что каждый из буферов для приёма достаточного размера.
Пётр.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Re: C++ pipe и socket в одной программе
« Ответ #4 : 16 Марта 2016, 17:46:28 »
Спасибо, тоже думал на буфер, но правда думал что совпадают имена буферов, про размер не модумал. Спасибо сейчас проверю.

Пользователь решил продолжить мысль 16 Марта 2016, 18:20:03:
Решил обратиться к "источнику", точнее к программе которая была написана не мной и модернизацией которой я сейчас занимаюсь. Так вот там, мне не понятно почему, человек поставил размер буфера на сокет = 501, зачем так много мне не понятно ибо recv() принимает не больше 6 байт, но я решил тоже поставить 501, проверю. До этого у меня размер буфера был 32.
« Последнее редактирование: 16 Марта 2016, 18:20:03 от Vlad.V »

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Re: C++ pipe и socket в одной программе
« Ответ #5 : 17 Марта 2016, 17:47:41 »
Увеличение размера буфера не спасло  :-\ :-[

Пользователь решил продолжить мысль 17 Марта 2016, 21:02:45:
Оказывается, после получения данных от сокет-клиента, сокет-сервер отправляет запрос в ОС через popen(), после чего читает ответ через fgets() и уже именно fgets() выдает ошибку, так как ответ с ОС перехватывает read() который должен читать только pipe. Звучит бредово и пока я не могу понять что происходит. Ответ с ОС, по идее, не может переполнить буфер, т.к. запись в буфер идет через fgets(), а он, как я понимаю, не даст записать в буфер больше чем размер буфера.
« Последнее редактирование: 17 Марта 2016, 21:02:45 от Vlad.V »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3026
    • Просмотр профиля
fgets() запишет столько байтов, сколько указано в её вызове без всяких проверок.
read() читает из того файла, дескриптор которого указан в её вызове,
так что проверьте, нет ли путаницы в обращенни к файлам.
Сам я каналами не пользуюсь, только однажды давно попробовал,
чтобы посмотреть, как это работает, но я использовал pipe(),
а затем читал из канала и передавал в него с помощью read()/write().
И зачем каждый раз использовать popen(), если достаточоно одного вызова pipe()?
Пётр.

 

Страница сгенерирована за 0.044 секунд. Запросов: 25.