Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SendBuf vs ALL [D5, WinME]


Страницы:   1 2

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;


Что у меня неправильно?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо