URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7182
[ Назад ]

Исходное сообщение
"вопрос по сокетам"

Отправлено djdxbr , 14-Фев-08 01:49 
вопрос такой,.. пишу сервер на блокирующих сокетах, для каждого соединения форкаю отдельный процесс при accept'е,.. потом читаю данные recv()... но дело в том что recv() возвращает что она прочитала только 255 байт из сокета, когда я точно знаю что послано было 765 байт...
в чем может быть причина?

Содержание

Сообщения в этом обсуждении
"вопрос по сокетам"
Отправлено from_mars , 14-Фев-08 03:25 
а если как-нить так попробывать?

while (recv(.., buffer) != 0){
  megabuffer += buffer
}
parse(megabuffer)


"вопрос по сокетам"
Отправлено jd2 , 14-Фев-08 05:19 
Причина в том (и это описано в мане), что читается столько байт, сколько доступно (принято) на данный момент, вплоть до (но возможно меньше) того количества, которое запрошено. Решается использованием флага MSG_WAITALL (см. примечание к нему) и/или написанием собственной функции-обёртки, которая будет читать, пока не прочитает сколько нужно или соединение не будет разорвано.

В любом случае, чтение манов является хорошей и общепринятой практикой, особенно при использовании вызовов, работу которых Вы не до конца понимаете.


"вопрос по сокетам"
Отправлено djdxbr , 15-Фев-08 01:04 
спасибо! MSG_WAITALL помог... правда где-то в половине случаев соединение рвется по таймауту, но зато приходят все данные :)