Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 18.09.2013
Сообщений: 47

Нестандартное поведение сервера при отправке пакетов

07.05.2015, 18:52. Показов 1174. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пишу сервер - компилирую в g++
все вроде работает, но как показала практика немного непонятно почему именно так.

в коде программы есть следующие строки:
C++
1
2
3
4
5
6
     send(sock, "welcome der`user!\n", 19, 0);
            send(sock, "\rserver version \n", 16, 0);
            send(sock, "(fork + sender)  \n", 19, 0);
            send(sock, "\rsender echo    \n", 13, 0);
            send(sock, "\rAdd PID info!  \n", 17, 0);
            send(sock,warnmsg,sizeof(warnmsg),0);
все вроде правильно, первым пакетом уходит и приходит строка "welcome der`user!\n"
и я ожидаю что второй пакет будет содержать следующую запись...
но не тут-то было
следующий пакет содержит уже ВСЕ! оставшиеся записи..."\rserver version \n" + "(fork + sender) \n" + ... и т.д.
это я через Wireshark вижу.

но что еще более мне не понятно, так это то, что данные на клиенте в буфер попадают не полностью!
а лишь частично :"\rserver version \n" + "(fork + sender) \n", остальное почему-то отбрасывается...

вот код клиента (кусочек):
C++
1
2
3
4
5
6
      sockaddr_in server_addr;
      char buff[1024];
      int server_addr_size=sizeof(server_addr);
 
      int n=recvfrom(soc,&buff[0],sizeof(buff)-1,0,
        (sockaddr *) &server_addr, &server_addr_size);
в програграмме n = 124 - т.е. все данные приняты успешно(?), но не обработаны.



подскажите как решить эту проблему.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2015, 18:52
Ответы с готовыми решениями:

нестандартное поведение списков
Помогите решить проблему. Не понимаю причины неправильного отображения списков, потому что иногда они отображаются правильно, а бывает, что...

Нестандартное поведение кнопки
Добрый вечер ! Прошу вашей помощи,столкнулся с очень неприятной проблемой... Суть проблемы вот в чём,нужно создать кнопку,при наведении...

Проверка сервера на работоспособность при отправке данных
Подскажите можно ли так сделать чтобы при отправке запроса определяло работает ли сервер или нет и если нет программы выводила допустим...

6
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
07.05.2015, 21:13
Alez, на одной стороне вы используете send() а на другой recvfrom(). У вас tcp или udp?
Если послднее, то отсылать нужно используя sendto(). Лучше выложите весь исходный код.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.05.2015, 21:14
Лучший ответ Сообщение было отмечено Alez как решение

Решение

Цитата Сообщение от Alez Посмотреть сообщение
подскажите как решить эту проблему.
Это не проблема, так работает TCP. В нем нет границ сообщений и
таких понятий, как "пакет". Данные, отправленные за X вызовов send,
будут приняты за Y вызовов recv. За сколько именно Y - неизвестно.
Данные могут прийти сильно фрагментированными (например, по 1 байту)
или "склеиться" в один кусок. Или в каком-то другом виде.
0
0 / 0 / 1
Регистрация: 18.09.2013
Сообщений: 47
07.05.2015, 21:34  [ТС]
так работает TCP
- не знал.
но тогда возвращаясь ко второй части вопроса - почему данные были обрадотаны лишь частично?
и как тогда быть с первым пакетом который прошел на прием нормально?
ведь исходя из логики, что он может быть разбит или объединен с другими, я не могу точно определить когда заканчивать прием сообщений...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
07.05.2015, 21:47
Лучший ответ Сообщение было отмечено Alez как решение

Решение

Alez, во всех протоколах, которые построены поверх TCP,
есть механизмы определения конца очередной порции данных.
Где-то для этого используется специальный байт-маркер, где-то длина
передается в самом начале, где-то существуют заголовки (типа
Content-Length в HTTP). Вам следует сделать нечто подобное.
0
0 / 0 / 1
Регистрация: 18.09.2013
Сообщений: 47
08.05.2015, 17:08  [ТС]
может кто подскажет какие символы (специальные аля '\o') не передаются по сети?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.05.2015, 17:56
Любые передаются
Но в некоторых ситуациях можно "выкрутиться".
Например, если известно, что передаваться будут строго текстовые
данные, то можно признаком конца сделать нулевой символ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.05.2015, 17:56
Помогаю со студенческими работами здесь

Нестандартное поведение WDC WD10EZEX
Доброго времени суток. Опишу проблему: Стал замечать что в редкие моменты подгрузка с жестких дисков зашкаливала (индикатор HDD)...

Разные ответы от сервера при отправке одного запроса
Как исправить чтобы они были одинаковы? Использую библиотеку ReqDotNet Для отправки запроса Также дописал в библиотеке добавление...

Отклик сервера 550 5.1.1 при отправке письма под CDO
Есть в процедуре перехват на Err, но при попытке отправить на заведомо ложный адрес он не срабатывает. Выпрыгивает :) MsgBox содержания: ...

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

Нестандартное поведение Asus STRIX GTX 970
Доброго времени! Проблемы пока нет, есть единичный случай, интересно мнение "что это было". Конфиг: Asus x99-s i7...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru