Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Нарывались на обратную ситуацию. 19.10.05 13:41 Число просмотров: 3464
Автор: cybervlad <cybervlad> Статус: Elderman
|
> Вопрос: как в этом случае будет работать стек TCP на > клиенте и сервере? Сервер "подвиснет", ожидая, пока клиент > "выкачает" оставшиеся 90 байт или же сервер всё отгрузит на > клиента (а канал в порядке), там все это сбуферизируется и > это добро отдадут клиенту, когда он осуществит следующее > чтение? Нарывались на обратную ситуацию.
Типа, клиент пишет в сокет "GET DATA/OK"
Сервер ему в ответ "ЛОВИ DATA 2048/OK" и пихает в сокет 2048 байт.
Клиент, прочитав"ЛОВИ DATA 2048/OK" готовит буфер размером 2048 байти делает блочное чтение из сокета 2048 байт. Функция чтения при этом возвращает реально прочитанное количество байт. Так вот, очень часто оно оказывалось меньше 2048. Повторный вызов функции "дочитывал" остатки. Иногда требовалось и более 2 вызовов. Объем считанных за раз данных никак не коррелировал с MTU. Т.е. как оно там в стеке работает - х.з. В результате просто поставили цикл типа while (dataread<2048).
Насчет зависания. Если сокет открыть как keepalive, то он будет периодически "взбадриваться" стеком и оставаться открытым. В противном случае, если по нему не гнать данных, он закроется по тайм-ауту через некоторое время.
Я бы сделал так:
1) На прикладном уровне ввел бы подтверждение со стороны клиента о приеме. Т.е. типа сервер плюнул в сокет данные, сделал fflush и ждет определенное время ответа "Ok".
2) Если ответа не пришло в течение заданного времени, закрыть сокет нафиг, проблемы клиента (на уровне стека он некоторое время будет close_wait)
3) Если от клиента пришло подтверждение, но он больше ничего не просит и сокет не закрывает, то по тайм-ауту сервер закрывает сокет.
|
|
|