| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > как проверить достоверность полученных данных |
| Автор: grg 27.8.2010, 09:19 |
| Здравствуйте, задача достаточно простая, но в сокетах только начинаю разбираться, подскажите правильное ли направление. Сама задача: есть сервер на котором крутится бесконечный цикл, сервер опрашивает несколько клиентов(1-10) подключенных по сети, получает от них структуры данных динамической длины, использует данные в расчетах, также время от времени отправляет некоторые данные обратно клиентам. Все это крутится в локальной сети, обмен по протоколу tcp. Данные представляют собой набор числовых и строковых значений произвольного размера. Цикл не должен затыкаться на обмене с клиентами - я так понимаю надо копать в сторону асинхронных сокетов. Вопросы: Каким образом удостоверится в приеме корректного(полного) блока данных? В манах написано, что при чтении или записи в сокет нет гарантии , что данные полностью будут отправлены или получены, собственно для того, чтобы удостовериться в получении цельного блока данных по сети (не зная на принимающей стороне точного размера блока данных), предполагаю надо создать структуру из магического числа+ (размер блока данных+)сами данные +чексумма+магическое число и на принимающей стороне сделать парсер выдергивающий из этого блок данных и далее делать с ним, что необходимо? Как лучше организовать передачу данных, не блокируя основной цикл? в отдельном потоке? Если для отправки организовать цикл, который вызывает send до тех пор, пока не отправится весь блок данных, он ведь заблокирует работу основной программы независимо от асинхронности сокетов так как ждет результата команды send? Есть ли пример неблокирующей передачи xml структуры(в принципе любой строки) с проверкой достоверности получения с одного сокета на другой? Для самообразования) Сейчас собираю информацию, код начну писать на выходных, не хочется просто в стену биться, скорей всего все придумано давным давно, вот и прощу дать направление. гуглом пользоваться умею. Заранее спасибо |
| Автор: Abyx 27.8.2010, 09:28 |
| grg, вы не так поняли маны. TCP гарантирует что если соединение не оборвалось, то данные будут переданы целиком и без изменений. Однако возможно что за 1 вызов функции recv или send будет передана только часть данных, а другие части при последующих вызовах. |
| Автор: grg 27.8.2010, 12:51 |
| спасибо. Просто не верилось, что получатель получит сигнал о приходе любого блока данных, только когда придет весь объем информации от отправителя, удобно. |