Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: recv получает какую-то непонятку в начале буфера  (Прочитано 11096 раз)
0 Пользователей и 1 Гость смотрят эту тему.
demon051
Помогающий

ru
Offline Offline

« : 02-04-2018 11:32 » 

Всем привет!

Делаю обмен по сокету.

char buf[1024];

memset(buf,0,sizeof(buf));
int bytes_read = recv(ss[0], buf, sizeof(buf), 0);


при получении любой посылки в первых 4х ее байтах находится непонятно что, а далее байты посылки
вывожу через cout побайтно, первый 4 байта всё время 3 0 0 . что за ерунда?
буфер обнуляю перед чтением. никаких смещений нигде не указываю...
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 02-04-2018 12:40 » 

Попробуйте задать вопрос более конкретно. Думаю, что у большинства разработчиков, писавших свои сетевые программы, подобный код работал без проблем. Как минимум - приведите минимально необходимый код, воспроизводящий проблему. Из кода, который Вы привели не понятно, TCP это или UDP, какая ОС. Возможно эти дополнительные байты так и передаются по сети и, соответственно, Вы ищете не там. Попробуйте проанализировать трафик утилитами типа tcpdump/wireshark.
Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #2 : 02-04-2018 12:51 » 

Попробуйте задать вопрос более конкретно. Думаю, что у большинства разработчиков, писавших свои сетевые программы, подобный код работал без проблем. Как минимум - приведите минимально необходимый код, воспроизводящий проблему. Из кода, который Вы привели не понятно, TCP это или UDP, какая ОС. Возможно эти дополнительные байты так и передаются по сети и, соответственно, Вы ищете не там. Попробуйте проанализировать трафик утилитами типа tcpdump/wireshark.

Ах, это ещё и от ОС зависит УлыбаюсьУлыбаюсьУлыбаюсь

Ну Debian, TCP, неблокирующие сокеты.

Более подробно привести зачем?
Отсылается с помощью

sendto(sd, msg->message, msg->msgSize,
                                        0, (struct sockaddr*)&addr, sizeof(addr));

массив байт

получается с помощью recv

для проверки работоспособности отправляю сам себе массив {1,2,3} или 1,2,3,4 и т.д.
получаю из recv 3,0,0,1,2,3 или 3,0,0,1,2,3,4 и и т.д.


Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 02-04-2018 12:59 » 


Ах, это ещё и от ОС зависит УлыбаюсьУлыбаюсьУлыбаюсь
Не знаю, много от чего может зависеть. У меня, например, таких проблем никогда не возникало.

Ну Debian, TCP, неблокирующие сокеты.

Более подробно привести зачем?
Если хотите получить какой-то осмысленный ответ. Раньше даже бытовал такой ответ: "извините, все телепаты в отпуске, что у Вас там стряслось - не знаем".

Отсылается с помощью

sendto(sd, msg->message, msg->msgSize,
                                        0, (struct sockaddr*)&addr, sizeof(addr));

массив байт

получается с помощью recv

для проверки работоспособности отправляю сам себе массив {1,2,3} или 1,2,3,4 и т.д.
получаю из recv 3,0,0,1,2,3 или 3,0,0,1,2,3,4 и и т.д.
Что такое msg->message?

Ещё раз - попробуйте посмотреть что реально идёт по линии связи при помощи tcpdump/wireshark. Конечно есть вероятность и в ошибках ядра/неисправности оборудования, но более вероятна, имхо, ошибка в программе автора, если не на принимающей, так на выдающей стороне.
Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #4 : 02-04-2018 13:06 » 


Ах, это ещё и от ОС зависит УлыбаюсьУлыбаюсьУлыбаюсь
Не знаю, много от чего может зависеть. У меня, например, таких проблем никогда не возникало.

Ну Debian, TCP, неблокирующие сокеты.

Более подробно привести зачем?
Если хотите получить какой-то осмысленный ответ. Раньше даже бытовал такой ответ: "извините, все телепаты в отпуске, что у Вас там стряслось - не знаем".

Отсылается с помощью

sendto(sd, msg->message, msg->msgSize,
                                        0, (struct sockaddr*)&addr, sizeof(addr));

массив байт

получается с помощью recv

для проверки работоспособности отправляю сам себе массив {1,2,3} или 1,2,3,4 и т.д.
получаю из recv 3,0,0,1,2,3 или 3,0,0,1,2,3,4 и и т.д.
Что такое msg->message?

Ещё раз - попробуйте посмотреть что реально идёт по линии связи при помощи tcpdump/wireshark. Конечно есть вероятность и в ошибках ядра/неисправности оборудования, но более вероятна, имхо, ошибка в программе автора, если не на принимающей, так на выдающей стороне.

msg->message это массив байт, например, {1,2,3}, размером msg->msgSize - в данном случае = 3
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #5 : 02-04-2018 16:41 » 

demon051, что-то у Вас там не то. Редко кто использует совместно TCP и sendto(). sendto() обычно используется для UDP, там где надо выдавать сообщения по разным адресам и/или без установа соединения. Плюс ко всему - не понятно, если у Вас msgSize = 3, то как Вы смогли принять 7 или 8 байт. Как было сказано выше - без минимально-необходимого кода воспроизводящего проблему разговор будет сводиться к гаданию на кофейной гуще, ещё может помочь просмотр пакетов в tcpdump/wireshark.
« Последнее редактирование: 02-04-2018 16:42 от darkelf » Записан
demon051
Помогающий

ru
Offline Offline

« Ответ #6 : 06-04-2018 05:42 » new

demon051, что-то у Вас там не то. Редко кто использует совместно TCP и sendto(). sendto() обычно используется для UDP, там где надо выдавать сообщения по разным адресам и/или без установа соединения. Плюс ко всему - не понятно, если у Вас msgSize = 3, то как Вы смогли принять 7 или 8 байт. Как было сказано выше - без минимально-необходимого кода воспроизводящего проблему разговор будет сводиться к гаданию на кофейной гуще, ещё может помочь просмотр пакетов в tcpdump/wireshark.
demon051, что-то у Вас там не то. Редко кто использует совместно TCP и sendto(). sendto() обычно используется для UDP, там где надо выдавать сообщения по разным адресам и/или без установа соединения. Плюс ко всему - не понятно, если у Вас msgSize = 3, то как Вы смогли принять 7 или 8 байт. Как было сказано выше - без минимально-необходимого кода воспроизводящего проблему разговор будет сводиться к гаданию на кофейной гуще, ещё может помочь просмотр пакетов в tcpdump/wireshark.

проверил: работает и sendto и просто send

теперь вот ещё темка про автостарт проги Улыбаюсь
https://forum.shelek.ru/index.php/topic,31051.msg304372.html#msg304372
« Последнее редактирование: 06-04-2018 05:54 от demon051 » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines