Форум: "Сети";
Поиск по всему сайту: 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.74 MB
Время: 0.031 c
1-117             Helpwuin              2002-03-21 16:30  2002.04.01  
Шифрование


1-127             SPeller               2002-03-21 13:28  2002.04.01  
Ненужные ресурсы


1-217             Aleksandr             2002-03-20 12:18  2002.04.01  
Что в программе может жрать ресурсы?


4-343             yus                   2002-01-30 22:28  2002.04.01  
Как отформатировать диск А: не выводя окна


14-295            UGH|B1ADE             2002-02-18 18:56  2002.04.01  
Плиз поможите !