2012-04-18 3 views
0

У меня есть клиент, который подключается к серверу и пытается получить send() некоторые данные. Однако есть два типа данных, которые мне нужно отправить, скажем, информацию о погоде и текущем времени (просто примеры).Использование send() дважды для отправки различных типов данных

Проблема заключается в: В клиенте я звоню send() дважды, один, чтобы отправить информацию о погоде и один текущее время, и на сервере я зацикливание recv().

Что я ожидал (и построил мой код) является то, что первый раз, когда сервер вызывает recv() это только получить информацию о погоде и на второй вызов recv() время, однако только один вызов recv() достаточно для обоего данных, которые должны быть получены в том же буфере.

В то время как это может быть и не так, проблема в том, что я построил свою программу вокруг этого предположения, и я просто хотел знать, есть ли способ достичь того, что я хочу (я думал о sleep() между двумя send() но это может быть ненадежным), так что я могу сэкономить время на переписывание кода.

Если кто-то знает способ, это сэкономит мне некоторое время, поэтому я ценю любую помощь.

ответ

0

Нет альтернативы надлежащему протоколу сообщений поверх TCP. TCP передает только поток октетов (байты). TCP не может передавать сообщения, структуры, объекты.

Если вы создали большую программу, предполагающую, что TCP может передавать сообщения самостоятельно, у вас проблемы.

Sleep() и таймеры не будут работать каким-либо надежным или исполнительным способом. Вы должны сделать это правильно и реализовать протокол поверх TCP, например. отправив заголовок, содержащий длину данных, или используя байты start/end и escape-байта, который появляется внутри данных.

+0

Хорошо, по крайней мере, я знаю, что я не трачу свое время, я собираюсь с заголовками и переписываю это. Благодарю. –

+0

Подсказка заголовков. Хорошим заголовком могут быть все байты ASCII, например. [SOH] "4096" [ETX] binaryData ..., где данные составляют 4096 байт. Заголовок, подобный этому, не связан с ним. Все машины читают и понимают это, и нет никакого разумного ограничения на размер данных, поскольку он заканчивается [ETX]. –

+0

байты должны быть такими: 0x01 0x1000 0x03? или нужны котировки? –