![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SendBuf vs ALL [D5, WinME]
Gamer © (2005-06-03 07:35:00)Доброго времени суток, мастера.
Помогите. Делаю программу администрирования сети. Суть такова что на одном компе стоит сервер, на остальном клиенты. Когда клиент подключается к серверу он (клиент) посылает информацию о себе:
cs.socket.SendBuf(info,sizeof(info));
Сервер её получает:
Socket.ReceiveBuf (info, sizeof (info));
И у меня выходит, что С. может получать только инфу о К. и более ничего (например: скриншот, список задач...). Вопрос: как мне предупредить С. о том что в даный момент я ему буду отправлять?
Gamer (2005-06-10 11:53:00) [1]Спасибо. Попробую.
Digitman (2005-06-10 11:23:00) [2]
> значит надо будет догрузить остальное позже или как?
да, позже, при следующих OnRead-событиях
Gamer (2005-06-10 11:10:00) [3][26] Digitman © (10.06.05 11:04)
А если реально прочитанное будет меньше, значит надо будет догрузить остальное позже или как?
Digitman (2005-06-10 11:06:00) [4]
> -=S.S=- © (10.06.05 11:04) [25]
а причем здесь xml ?
речь идет о транспорте как таковом, а не о формате транспортируемых данных
Digitman (2005-06-10 11:04:00) [5]
> имел ввиду функцию Socket.ReceiveBuf.
у функции этой есть параметр Size, которым ты должен указать, сколько байт ты желаешь прочитать из гнезда
ф-ция вернет тебе как результат реально прочитанное в Buffer число байт, которое не может быть больше желаемого (будет равно или меньше)
-=S.S=- (2005-06-10 11:04:00) [6]А почему бы не собрать инфу ... запихнуть его в xml и передать ?
Gamer (2005-06-10 10:57:00) [7]Я имел ввиду функцию Socket.ReceiveBuf.
Digitman (2005-06-10 10:40:00) [8]
> Gamer (10.06.05 10:17) [22]
> И оно само
кто "оно" ?
принимающая сторона должна знать точный размер передаваемого ему "файла", это значит что передающая сторона должна ПЕРЕД передачей собственно содержимого файла передать его размер
Gamer (2005-06-10 10:17:00) [9]> Действительное_число_прочитанных_байт := Socket.ReceiveBuf(буфер,
> требуемое_число_байт_для_считывания_в_буфер)
И оно само скопирует весь файл (в моем случае)?
Digitman (2005-06-10 08:33:00) [10]
> Gamer (10.06.05 08:14) [20]
> незнаю как получать картинку
в №2 , заметь, речи ни о каких "картинках" не идет - на транспортном уровне есть только некие данные. №2 это как раз и есть транспортный уровень.
> с многих К
точно так же как с одного
в обработчике OnClientRead :
Действительное_число_прочитанных_байт := Socket.ReceiveBuf(буфер, требуемое_число_байт_для_считывания_в_буфер)
здесь Socket - второй параметр процедуры обработки события, он отражает контекст соединения именно с тем клиентом, пришедшие данные от которого ты считываешь в тек.момент
Gamer (2005-06-10 08:14:00) [11]Найболее проблематичным для меня является этап №2. Я незнаю как получать картинку с многих К. С одним проблем меньше.
Digitman (2005-06-09 10:43:00) [12]нет, я не о том ..
задача делится минимум на 3 крупных ("ключевых") этапа
1. формирование и подготовка на передающей стороне данных для передачи
2. Собственно передача этих данных и их прием на другой стороне соединения
3. Обработка (например, визуализация) принятых данных на принимающей стороне
какой конкретно этап у тебя вызывает затруднения в реализации ?
Gamer (2005-06-09 10:35:00) [13]Чтобы на экране С. в один момент показывались несколько экранов К.?
Digitman (2005-06-09 09:55:00) [14]
> как это можно реализовать
реализовать чтоконкретно ?
Gamer (2005-06-09 09:51:00) [15]Подскажите, пожалуйста, как это можно реализовать. Хотя бы схематически.
Digitman (2005-06-08 13:47:00) [16]
> Можно ли сделать чтобы на экране С. в один момент показывались
> несколько экранов К.?
можно.
> файл который я послал с К. приходит на С. за один OnClientRead?
не обязательно.
может и за один, а может и за N
Gamer (2005-06-08 13:36:00) [17]Еще раз здравствуйте.
Эту проблему я, кажется, решыл. Но у мнея появился еще один вопрос. Можно ли сделать чтобы на экране С. в один момент показывались несколько экранов К.? И еще один вопрос: файл который я послал с К. приходит на С. за один OnClientRead?
Slym (2005-06-06 08:43:00) [18]CInfa, CComanda - глобальные переменные?! Это не правильно...
Ты работаешь с асинхронным сокетом как с синхронным! Это тоже не правильно...
Я за протокол (в последнее время) беру XML... глубоко структурированный, расширяемый "протокол" (язык общения/сообщения) - иногда Prefix (byte=MaxByte) не хватает! (хотя есть Integer/Int64)
Digitman (2005-06-06 08:24:00) [19]
> Что у меня неправильно?
все неправильно.
1) неправильное использование неблокирующего режима гнезд
2) неправильная передача/прием неправильных структур
инф-ция тебе к размышлению : чему равно значение sizeof (CInfa)) или sizeof(comanda)) ? посмотри под отладчиком и подумай ...
Gamer (2005-06-05 16:22:00) [20]Помогите, что-то никак не могу разобраться. Если одно приложение действует как клиент и сервер, то все хорошо, а вот когда запускаю два приложения (сервер и клиент), то С. получает какие-то странные значения.
procedure TForm1.Button4Click(Sender: TObject);//Посылка команды
var
Prefix: Byte;
begin
comanda.command:=ecom.text;
comanda.param1:=ep1.text;
comanda.param2:=ep2.text;
prefix:=1;
cs.socket.SendBuf(Prefix,sizeof(Prefix));
cs.socket.SendBuf(comanda,sizeof(comanda));
end;
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);//Прием сообщений
var
prefix:byte;
begin
Socket.ReceiveBuf(Prefix, sizeof (Prefix));
if prefix=0 then begin
Socket.ReceiveBuf(CInfa, sizeof (CInfa));
slb.lines.add(cinfa.hdd);
slb.lines.add(cinfa.cpu);
slb.lines.add(cinfa.res);
end
else if prefix=1 then begin
Socket.ReceiveBuf(CComanda, sizeof (CComanda));
slb.lines.add(CComanda.command);
slb.lines.add(CComanda.param1);
slb.lines.add(CComanda.param2);
end;
end;
Что у меня неправильно?