Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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)



Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.005 c
3-55
kaif
2002-03-07 14:19
2002.04.01
можно ли обрезать строку без использования UDF?


3-77
Dimedrol
2002-02-13 10:32
2002.04.01
начинаю с Interbase.


14-283
valler
2002-02-17 00:22
2002.04.01
У кого есть файл Proxies.pas?


4-366
JAndrey
2002-01-31 01:18
2002.04.01
Как сделать автозапуск при загрузке?


1-107
kolobok
2002-03-21 12:33
2002.04.01
Проблема с встроенным в TStringGrid чекбоксом !





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский