Текущий архив: 2005.10.02;
Скачать: CL | DM;
Вниз
SendBuf vs ALL Найти похожие ветки
← →
Gamer (2005-06-03 07:35) [0]Доброго времени суток, мастера.
Помогите. Делаю программу администрирования сети. Суть такова что на одном компе стоит сервер, на остальном клиенты. Когда клиент подключается к серверу он (клиент) посылает информацию о себе:
cs.socket.SendBuf(info,sizeof(info));
Сервер её получает:
Socket.ReceiveBuf (info, sizeof (info));
И у меня выходит, что С. может получать только инфу о К. и более ничего (например: скриншот, список задач...). Вопрос: как мне предупредить С. о том что в даный момент я ему буду отправлять?
← →
Digitman © (2005-06-03 08:28) [1]
> как мне предупредить С. о том что в даный момент я ему буду
> отправлять?
точно так же как ты сообщил Серверу информацию о Клиенте
← →
Slym © (2005-06-03 11:41) [2]Протокол передачи придумывай...
← →
Gamer (2005-06-03 12:04) [3][1] Digitman © (03.06.05 08:28)
Да но у меня инфа:TInfo = record
а команды, например:
CpuSpeed,Hdd,Video,Os,ComputerName:string;
end;TCommand = record
Command,Param1,Param2,Param3:string;
end;
и мне надо определить, что пришло.
Или мне все передавать в виде TCommand?
[2] Slym © (03.06.05 11:41)
Это как?
← →
Digitman © (2005-06-03 12:13) [4]
> Gamer (03.06.05 12:04) [3]
посылай сначала префикс, определяющий какую конкретно структуру ты намерен послать, а следом - саму эту структуру
в твоем простейшем случае префикс м.б. байтом со значениеми, например, равными
1 - следом посылаю структуру TInfo
2 - следом посылаю структуру TCommand
принимающая сторона принимает от тебя сначала байт префикса, анализирует его значение и в зависимости от этого значения ветвит дальнейший свой алгоритм :
1 - следом ожидаю и принимаю структуру TInfo
2 - следом ожидаю и принимаю структуру TCommand
это и есть элемент протокола инф.обмена между сервером и клиентом
← →
Gamer (2005-06-03 12:22) [5][4] Digitman © (03.06.05 12:13)
Не могли бы Вы подробнее написать, как посылать этот префикс?
← →
Digitman © (2005-06-03 13:19) [6]точно так же как ты и все остальное намерен был посылать
var
Prefix: Byte;
cs.socket.SendBuf(Prefix,sizeof(Prefix));
Socket.ReceiveBuf(Prefix, sizeof (Prefix));
← →
SammIk © (2005-06-03 15:24) [7]Блин когда я дела, был у меня тако стаб
DaTa_ struct
Command:DWORD;Команда, тобишь номер команды. Старшии бит еще и флагом был
Param1:DWORD;Параметры, могли быть смещением от начала этои с труктуры( например для строк)
Param2:DWORD;
Param3:DWORD;
Param4:DWORD;
len:DWORD;Длинна данных не учитывая этот стаб.
ends
Сервер(клиент) получал данные(причем получал руководствуясь полем len).
И выполнял команду(Command).
Причем в зависимости от номера комманды, поля paramX воспринемались по разному.
← →
Digitman © (2005-06-03 15:32) [8]
> SammIk © (03.06.05 15:24) [7]
те же фаберже, только вид сбоку)
← →
Gamer (2005-06-03 19:03) [9]Спасибо, работает. Но не будет ли такой проблемы, что в один момент несколько клиентов отправлят эти префиксы и программа что-то сделает не так?
← →
SammIk © (2005-06-04 14:46) [10]
> Digitman © (03.06.05 15:32) [8]
Гы, с низу)
← →
Gamer (2005-06-05 16:22) [11]Помогите, что-то никак не могу разобраться. Если одно приложение действует как клиент и сервер, то все хорошо, а вот когда запускаю два приложения (сервер и клиент), то С. получает какие-то странные значения.
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;
Что у меня неправильно?
← →
Digitman © (2005-06-06 08:24) [12]
> Что у меня неправильно?
все неправильно.
1) неправильное использование неблокирующего режима гнезд
2) неправильная передача/прием неправильных структур
инф-ция тебе к размышлению : чему равно значение sizeof (CInfa)) или sizeof(comanda)) ? посмотри под отладчиком и подумай ...
← →
Slym © (2005-06-06 08:43) [13]CInfa, CComanda - глобальные переменные?! Это не правильно...
Ты работаешь с асинхронным сокетом как с синхронным! Это тоже не правильно...
Я за протокол (в последнее время) беру XML... глубоко структурированный, расширяемый "протокол" (язык общения/сообщения) - иногда Prefix (byte=MaxByte) не хватает! (хотя есть Integer/Int64)
← →
Gamer (2005-06-08 13:36) [14]Еще раз здравствуйте.
Эту проблему я, кажется, решыл. Но у мнея появился еще один вопрос. Можно ли сделать чтобы на экране С. в один момент показывались несколько экранов К.? И еще один вопрос: файл который я послал с К. приходит на С. за один OnClientRead?
← →
Digitman © (2005-06-08 13:47) [15]
> Можно ли сделать чтобы на экране С. в один момент показывались
> несколько экранов К.?
можно.
> файл который я послал с К. приходит на С. за один OnClientRead?
не обязательно.
может и за один, а может и за N
← →
Gamer (2005-06-09 09:51) [16]Подскажите, пожалуйста, как это можно реализовать. Хотя бы схематически.
← →
Digitman © (2005-06-09 09:55) [17]
> как это можно реализовать
реализовать что конкретно ?
← →
Gamer (2005-06-09 10:35) [18]Чтобы на экране С. в один момент показывались несколько экранов К.?
← →
Digitman © (2005-06-09 10:43) [19]нет, я не о том ..
задача делится минимум на 3 крупных ("ключевых") этапа
1. формирование и подготовка на передающей стороне данных для передачи
2. Собственно передача этих данных и их прием на другой стороне соединения
3. Обработка (например, визуализация) принятых данных на принимающей стороне
какой конкретно этап у тебя вызывает затруднения в реализации ?
← →
Gamer (2005-06-10 08:14) [20]Найболее проблематичным для меня является этап №2. Я незнаю как получать картинку с многих К. С одним проблем меньше.
← →
Digitman © (2005-06-10 08:33) [21]
> Gamer (10.06.05 08:14) [20]
> незнаю как получать картинку
в №2 , заметь, речи ни о каких "картинках" не идет - на транспортном уровне есть только некие данные. №2 это как раз и есть транспортный уровень.
> с многих К
точно так же как с одного
в обработчике OnClientRead :
Действительное_число_прочитанных_байт := Socket.ReceiveBuf(буфер, требуемое_число_байт_для_считывания_в_буфер)
здесь Socket - второй параметр процедуры обработки события, он отражает контекст соединения именно с тем клиентом, пришедшие данные от которого ты считываешь в тек.момент
← →
Gamer (2005-06-10 10:17) [22]> Действительное_число_прочитанных_байт := Socket.ReceiveBuf(буфер,
> требуемое_число_байт_для_считывания_в_буфер)
И оно само скопирует весь файл (в моем случае)?
← →
Digitman © (2005-06-10 10:40) [23]
> Gamer (10.06.05 10:17) [22]
> И оно само
кто "оно" ?
принимающая сторона должна знать точный размер передаваемого ему "файла", это значит что передающая сторона должна ПЕРЕД передачей собственно содержимого файла передать его размер
← →
Gamer (2005-06-10 10:57) [24]Я имел ввиду функцию Socket.ReceiveBuf.
← →
-=S.S=- © (2005-06-10 11:04) [25]А почему бы не собрать инфу ... запихнуть его в xml и передать ?
← →
Digitman © (2005-06-10 11:04) [26]
> имел ввиду функцию Socket.ReceiveBuf.
у функции этой есть параметр Size, которым ты должен указать, сколько байт ты желаешь прочитать из гнезда
ф-ция вернет тебе как результат реально прочитанное в Buffer число байт, которое не может быть больше желаемого (будет равно или меньше)
← →
Digitman © (2005-06-10 11:06) [27]
> -=S.S=- © (10.06.05 11:04) [25]
а причем здесь xml ?
речь идет о транспорте как таковом, а не о формате транспортируемых данных
← →
Gamer (2005-06-10 11:10) [28][26] Digitman © (10.06.05 11:04)
А если реально прочитанное будет меньше, значит надо будет догрузить остальное позже или как?
← →
Digitman © (2005-06-10 11:23) [29]
> значит надо будет догрузить остальное позже или как?
да, позже, при следующих OnRead-событиях
← →
Gamer (2005-06-10 11:53) [30]Спасибо. Попробую.
Страницы: 1 вся ветка
Текущий архив: 2005.10.02;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.047 c