Работа с сокетами

sky_fox

Новичок
Работа с сокетами

Тема - скорее вопрос.

Допустим, есть необходимость написать на php клиент для кратковременного приема-передачи данных с неким сервером. Кратковременного - не более 30 секунд.

Клиент заходит под определенным логином, отправляет запросы-получает данные.

В какой-то момент времени получается такое, что в ответ за запрос n приходит кусок ответа на запрос n-1. Т.е при вычитке данных из сокета для запроса n-1 вычиталось не все. Пробовал комбинации из мануала типа while (!feof... - но тогда вычитка стопорится в таком цикле, т.к соединения вроде бы не кратковременное, т.е послал запрос-получил ответ-отключился.

Вопрос такой - как либо считать полностью ответ, либо определить его длину
 

FreeSpace

Чукча-читатель
Вообще-то такие вещи должен предусматривать и оговаривать протокол.
Например, в HTTP используется специальная комбинация символов - "\r\n\r\n".
Клиент закончил отправку запроса - в конце добавил "\r\n\r\n".
Сервер закончил отправку заголовков ответа - в конце добавил "\r\n\r\n" и т.д.

Вот в таком случае следует ждать, пока не получишь от сервера последовательность "\r\n\r\n", пока не наступит таймаут сокета или сокет не закроется преждевременно.

Есть и другой подход, который часто используется в динамических протоколах с высоким трафиком, например в сетевых играх.
Первые два байта логического пакета - его длинна. И обработка пакета не начинается до тех пор, пока не будет загружена вся его длинна.
При этом один (большой) логический пакет может быть разбит на несколько сетевых, или в одном сетевом пакете могут находится несколько (маленьких) логических пакетов.

Может есть и другие варианты, но пока ничего больше в голову не приходит.
Так что если ты сам разработчик протокола, то выбирай, а если только пользователь - изучай протокол.
 
Сверху