- *qt *c++ *говноСраное говно, как я ненавижу эти несовершенные абстракции. В сокет могут придти не все данные, поэтому нужно считать первые 4 байта, в которых записана длина пакета, и проверить, пришло ли столько, или все же меньше. Если меньше — подождать еще, если больше — считать первые $длинапакета байт.
Но не все так просто, потому что пакет может быть большим и не влезть в буфер ОС для сокета. Поэтому надо периодически считывать оттуда данные в свой временный буфер, и ручками высчитывать, когда уже можно читать оттуда данные, а когда еще надо ждать. Вообще говоря, кутя умеет собственный внутренний буфер, но, судя по всему, он иногда не работает.
Почему, блять, такие тривиальные операции нужно делать руками в 21 веке со всеми этими кутями?
Это нихрена не sequential device, эти ваши сокеты, и не нужно их представлять как sequential device. Говно.
Replies (39)
- @0xd34df00d:@Cirno Они решили отказаться от сокетов?
- @0xd34df00d:@Cirno Это ограничение ОС, чувак. И сраного TCP/IP.
- @0xd34df00d:@longedok Што? А если в байтэррее есть \0 сам по себе?
- @longedok:@0xd34df00d А, ну я что-то не подумал, что у тебя в данных может быть ноль.
- @borman:<<Length:32, Data:Length/binary, NewBuffer/binary>> = <<NewData/binary, Buffer/binary>>
Это насчет совершенных абстракций.from Vacuum IM, 12 months ago - @borman:@0xd34df00d Такой способ приема данных из сокета нравится?from Vacuum IM, 12 months ago, in reply to /11
- @arrowdodger:>пакет может быть большим и не влезть в буфер ОС для сокета
Ты это серьезно?from Gajim, 12 months ago - @0xd34df00d:@arrowdodger Тут имеется ввиду не TCP-пакет, а пакет данных в моем протоколе. Может быть и метр и два.from idead, 12 months ago, in reply to /15
- @arrowdodger:@0xd34df00d И чо? Ты говоришь, что если я приму подключение, туда будут слать, а не буду делать recv(), то в какой-то момент случится страшное говно?from Gajim, 12 months ago, in reply to /16
- @0xd34df00d:@arrowdodger А что, нет? У тебя бесконечное количество памяти?from idead, 12 months ago, in reply to /17
- @arrowdodger:@0xd34df00d И на каком объеме такое случается?from Gajim, 12 months ago, in reply to /18
- @0xd34df00d:@arrowdodger Хер знает. Проверять экспериментально неохота, тем более, что на отличных от моей машинах может быть все по-другому.from idead, 12 months ago, in reply to /19
- @arrowdodger:@0xd34df00d Откуда ты вообще это взял? Такая херня может случится только если у ядра память кончится, на мой взгляд.from Gajim, 12 months ago, in reply to /20
- @arrowdodger:@0xd34df00d Так был значит опыт? Ну вот и поделись при каких обстоятельствах и с какими симптомами.from Gajim, 12 months ago, in reply to /22
- @0xd34df00d:@arrowdodger QTcpSocket, качал с локального FTP-сервера, на этой же машине, установил специально кутишный буфер в маленькое значение. Начиная с некоторого интервала T между началом скачивания и recv(), объем данных, возвращенный recv(), не зависел от T.from idead, 12 months ago, in reply to /23
- @arrowdodger:@0xd34df00d Это еще ничего не доказывает. Может следующий вызов тоже бы сразу вернул, потому что ядро совало бы тебе порциями данные. Надо докачать все до конца, потом проверить. Олсо, какая ось?from Gajim, 12 months ago, in reply to /24
- @0xd34df00d:@arrowdodger Для меня это уже все равно недостаточно консистентное поведение.
То был линух, 2.6.20 примерно, amd64, gentoo-sources :3
Собснна, щас на 2.6.32 вот сижу. Планируется работать под линухом-вендой-маком-фрёй-etc.from idead, 12 months ago, in reply to /25 - @arrowdodger:@0xd34df00d Ну мало ли, может кутя виновата сама. Не может быть, чтобы так данные всирались из-за ОС.from Gajim, 12 months ago, in reply to /26
- @arrowdodger:@O01eg В куте всёр. А рекв все что надо возвращает. Ты нашел, блин, где тестировать. Надо ж на беркли сокетах.from Gajim, 12 months ago, in reply to /28
- @O01eg:@arrowdodger recv не может вернуть больше, чем буффер или пришло в пакете, его надо ещё раз вызывать же.from Ψ+, 12 months ago, in reply to /29
- @arrowdodger:@O01eg Ну да, это вполне нормальное поведение. Я думал у тебя данные терялись если их долго не реквать. Т.е. ты не рекваешь час, потом реквнул и получил не те данные, которые пришли час назад, а позднее. А те утерялись.from Gajim, 12 months ago, in reply to /30
- @0xd34df00d:@arrowdodger Имелось-то ввиду, что как раз новые данные приходить не будут, возможно.from idead, 12 months ago, in reply to /31
- @0xd34df00d:@O01eg QAbstractSocket::readAll() → считывает все данные ваще из сокета.from idead, 12 months ago, in reply to /36
- @arrowdodger:@0xd34df00d Ну что за возможно? Ты сталкивался или нет? Я никогда об этом не слышал, не сталкивался и не заморачивался -> невозможно.from Gajim, 12 months ago, in reply to /35
- @0xd34df00d:@arrowdodger Охуенная логика.
Я же тебе рассказал юзкейс.from idead, 12 months ago, in reply to /38 - @arrowdodger:@0xd34df00d Твой пример нихрена не доказывает.from Gajim, 12 months ago, in reply to /39
- @0xd34df00d:@analizer Ох неохота, кутишные сокеты неплохо вписываются в кутишный же эвентлуп.from idead, 12 months ago, in reply to /41