Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Вниз

Работа с сокетами 


Valdemar   (2002-01-17 14:37) [0]

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



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

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



Valdemar   (2002-01-17 16:16) [2]

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

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

end;



Digitman   (2002-01-17 17:25) [3]

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



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

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



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

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

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

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



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

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



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

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



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

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;



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

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




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.017 c
4-350             MrAngel               2002-01-28 16:58  2002.04.01  
Shell Creating - вечная проблема. Часть вторая.


3-37              Yulik                 2002-03-07 11:23  2002.04.01  
DbGrid


1-123             Mikhail               2002-03-20 18:37  2002.04.01  
Как отуродовать окошко Hint a


6-274             Krok                  2002-01-15 02:34  2002.04.01  
Как реализовать СЕТЕВОЕ ОКРУЖЕНИЕ


3-44              kaif                  2002-02-28 11:11  2002.04.01  
кто знает? Сбой клиента IB.