информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСтрашный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / networking
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Нарывались на обратную ситуацию. 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) Если от клиента пришло подтверждение, но он больше ничего не просит и сокет не закрывает, то по тайм-ауту сервер закрывает сокет.


<networking> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach