Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про сокеты, а точнее про FD_CLOSE и FD_READ [D6, Win95/98, WinME, Win2k, WinXP]


Страницы:   1 2 3

__Unnamed__ ©   (2007-10-01 17:52:00) 

Сделал сервак на основе сокетов. Использовал WS Api функции. Обработка информации происходит следуюющим образом:

Да это все в потоке :)

While not Terminated do
 Begin
    Res:=WaitForMultiPleObjects(1,FSockEvent,False,100,Flase);
    Case Res Of
      0: Begin
             ...
              <здесь проверяю флаги>
              FD_CLOSE
              FD_READ
              FD_WRITE
             ...
          End;
    End;
 End;
Суть вопроса! :)
Выявил следующую ошибку.
Когда передаю большой файл >1Mb по нескольким соединениям(т.е. различные файлы, но соединений более 1-го) иногда не доходит до получателя последний блок. Экспериментальным путем выявил, что  FD_Close приходит раньше, чем FD_READ.
Т.к. сервер не мой (т.е. не мною писанный). логика сервера заключается в том, что при посылке конечного куска файла он завершает соединение Shutdown + CloseSocket Или просто CloseSocket (Онное мне не известно).
Как я помню из сокетов на основе оконных функций FD_CLOSE приходит всегда после того как прийдет последний байт из буфера чтения.
Еще прочитал про критические секции, возможно в этом решение. Т.к. при изучении модуля ScktComp обнаружил, что  любая операция I/O заключена в Enter и Leave.
Скажите не потеряется ли быстродействие и независимость самого потока при использовании критических секций.
Или же моя ошибка заключается в другом? :)


Slym   (2007-10-02 04:32:00) [41]

FD_CLOSE и FD_READ могут приходить одновременно...
WSAEnumNetworkEvents выдает все текущие флаги и проверять надо так
if (lNetworkEvents and FD_READ)<>0 then
begin
//reading
end;
if (lNetworkEvents and FD_CLOSE)<>0 then
begin
//Closing
end;

http://www.sources.ru/cpp/cpp_network_evets_winsock2.shtml


__Unnamed__   (2007-10-01 22:13:00) [42]

Ответьте на вопрос.
Может ли прийти FD_CLOSE, если буфер приема еще не пуст?


__Unnamed__   (2007-10-01 21:59:00) [43]

Может кто-нибудь подскажет, что это может быть?
Или все будут морозиться...


__Unnamed__   (2007-10-01 18:44:00) [44]

Может конечно вопрос звучит глупо, но после FD_CLOSE приходит FD_READ в котором доходит оставшийся кусок!!!!
Но после FD_CLOSE как положенно можно выходить из цикла и потока, поэтому я и написал сюда, может быть кто-нибудь подскажет.
Может нужно использовать критические секции?
Режим у сокетов неблокирующий.
Просто из описания критических секций я понял, что остальные потоки приостанавливаются для ожидания выполнения самой критической секции.
Т.о. независимость каждого потока нарушается, как я понимаю. Все ждут одного????!!!!!!
Если я не прав пожалуйста поправте :)
И почему Borland в ScktComp везде на операцияx чтения/записи использует CriticalSection?


__Unnamed__   (2007-10-01 18:16:00) [45]

Да когда делал, через оконные функции, то все доходило нормально, но как-то хотелось бы, чтобы все было в потоке :)
Заранее спасибо!


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо