Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1126011382
Santrope
2005-09-06 16:56
2005.10.02
Сервер с двумя сетевыми картами. Как настроить?


1-1126593047
Leonid
2005-09-13 10:30
2005.10.02
Установка прав доступа


14-1126170736
КаПиБаРа
2005-09-08 13:12
2005.10.02
Про звук телевизора из радио


6-1118038275
ZubrZubr
2005-06-06 10:11
2005.10.02
Просмотр Защищенного хранилища


2-1124797165
UVV
2005-08-23 15:39
2005.10.02
Два вопроса...