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

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

Работа с сокетами [D5, Win95/98, Win2k]


Valdemar ©   (2002-01-17 14:37:00) 

Я работаю с сокетом в синхронном режиме. Как мне определить что во входящем потоке есть несчитанные данные. Если можно примерчик.
Заранее благодарен.


Digitman   (2002-01-18 09:00:00) [1]

Т.о., в событии OnAccept() ты вычерпал буфер чтения гнезда, буфер пуст (больше клиент ничего не передавал) и транспорт переходит в состояние Disconnected (клиент попросту отключается сервером), а транспортный поток либо завершается либо возвращается диспетчером в пул свободных (при KeepInCache = True)


Digitman   (2002-01-18 08:54:00) [2]

ThreadBlocking, говоришь ?
Тогда могу с достат.долей уверенности предположить, что класс TServerClientThread ты переопределить не додумался. И даже не заглядывал в реализацию его метода ClientExecute. Так ведь ? Тогда гляди сюда, я сделаю за тебя работу по анализу происходящего в трансп.потоке клиентского соединения на ThreadBlocking-сервере :


procedure TServerClientThread.ClientExecute;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
// пока нет сигнала о завершении тр.потока И транспорт активен
while not Terminated and ClientSocket.Connected do
begin
FD_ZERO(FDSet);
FD_SET(ClientSocket.SocketHandle, FDSet);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
//ожидание в пол-секунды с проверкой состояния объекта-события WSAEvent, ассоциированного с гнездом
if (select(0, @FDSet, nil, nil, @TimeVal) > 0) and not Terminated then

// если объект-событие WSAEvent находится в состоянии Signaled (еще точнее - сигнализирует о событии FD_READ) И поток не извещен пока извне о необходимости завершения, то :


if ClientSocket.ReceiveBuf(FDSet, -1) = 0 then
//если буфер чтения гнезда пуст

Break // выход из цикла, завершение транспорта, клиентское соединение будет разорвано - нет больше данных от клиента
else
Synchronize(DoRead); // возбудить в осн.потоке событие OnClientRead, в котором можно прочитать буфер (целиком или частично)
if (select(0, nil, @FDSet, nil, @TimeVal) > 0) and not Terminated then
Synchronize(DoWrite); //возбудить однократно событие OnClientWrite для информирования о готовности гнезда к передаче данных клиенту
end;
end;


Valdemar   (2002-01-17 22:20:00) [3]

В том что клиент конектится верно я уверен так как при возникновении onAccept я данные читаю нормально но немогу считать следующюю порцию данных.


Valdemar   (2002-01-17 19:03:00) [4]

В том то и доло что сервер onThreadBlocking


Digitman   (2002-01-17 18:15:00) [5]

А почему приложение должно "подвисать"-то ? Оно что, цикл какой-то длительный у тебя выполняет в обработчике OnClientRead ? Нет там у тебя никаких циклов перед чтением буфера, насколько это очевидно из твоего фрагмента.

"Не попадает" - значит, либо "клиент" ничего не передает, либо сервер неактивен, либо он - ThreadBlocking, либо... да мало ли еще причин каких !

Ты вообще-то уверен, что "клиент" успешно соединился с сервером ? На основании чего уверен ? Событие OmClientCoinnect возникало ? Если - возникало, тогда и событие OnClientRead должно возникать. А если его нет, значит, либо соединение уже разорвано, либо "клиент" не посылает ничего или неверно посылает, либо ... опять же - мало ли чего !


Valdemar   (2002-01-17 18:03:00) [6]

Application.ProcessMessages для того чтоб приложение не подвисало когда ждет даных
А не рабоьает так как не попадает сюда


Digitman   (2002-01-17 17:25:00) [7]

1. Зачем - Application.ProcessMessages ?
2. Что значит - "не работает" ?


Valdemar   (2002-01-17 16:16:00) [8]

Тогда почему не работает ткаой кусок кода?

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
tr:trec;
begin
Application.ProcessMessages;
socket. ReceiveBuf(tr,sizeof(tr));
//обработка

end;


Digitman   (2002-01-17 14:41:00) [9]

в синхронном режиме ничего определять не нужно. в этом режиме событие OnRead возникает именно когда во вх.потоке есть доступные для чтения данные


Наверх

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