主页
Top.Mail.Ru Yandeks.Metrika
论坛:“网络”;
当前存档: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;
套接字:TCustomWinSocket);
VAR
tr:trec;
开始
Application.ProcessMessages;
socket. ReceiveBuf(tr,sizeof(tr));
//处理

结束;



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.59 MB
时间:0.026 c
1-93
AHD
2002-03-19 11:31
2002.04.01
的Dimetra


1-84
Serzhzhzh
2002-03-21 09:11
2002.04.01
区分非日期范围MonthCalendar


1-167
VCL
2002-03-18 22:12
2002.04.01
帮助处理RichEdit。


1-219
Fellomena
2002-03-20 10:49
2002.04.01
线程......(内部)


1-232
库克群岛
2002-03-20 18:36
2002.04.01
托盘





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский