Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Попробую 10.07.03 13:39 Число просмотров: 1163
Автор: amirul <Serge> Статус: The Elderman
|
> Тут проблемка есть... > > Написал я сервер маленький, шлю файл через сокет.. > > 1. создаю сокет > 2. законектился > 3. начинаю передавать данные Как передаешь, куском или по частям? Хотя если части большие, это вроде бы не имеет разницы.
> если файл больше 100 кил, он почему-то полностью не доходит > до клиента, > посмотрел, сервер отправляет полность, а вот доходить не > доходит... В каком смысле не доходит. У TCP есть контроль доставки. Так что если все отослано, все и будет получено или будет перепосылаться пока не надоест
> В чем баг? > > Сокет не блокирующий (пробовал переводил в блокирующий > режим нифига > не помогает)... Если после отправки порции ставлю > sleep(100); файл доходит.. Но тогда получается, что буфер > сокета не успевает очистится, а я уже туда новую партию > данных пихаю.. Буфер можно смотреть getsockopt-ом с SO_RCVBUF или SO_SNDBUF. Вот только если буфера не хватит, send() будет блокироваться до тех пор, пока все не отошлется и не подтвердится, так что за буфер не боись. Возможно тебя задерживает Nagle Algorithm - он задерживает (5 пакетов в секунду), а ты тем временем делаешь closesocket или shutdown и все теряется. В этом случае смотри на setsockopt с SO_LINGER - тут можно выставить задержку закрытия сокета после вызова close, необходимую для отправки оставшихся в буфере данных (ну и попутно задать таймаут на блокирование самого close-а)
> Как тогда узнать сколько в буфере места ? Вроде никак (по крайней для мере send буфера). Вызов send не вернется пока места не станет хватать, но данные не сдропятся - не боись :-)
> > Сокеты не Delphi`ские, а виндовые... (ну там connect(), > select() и т.д.) > > Помогите у кого опыт есть!!!!
|
|
|