Текущий архив: 2005.10.02;
Скачать: CL | DM;
Вниз
Обмен данными по локальной сети Найти похожие ветки
← →
Ylia___ (2005-09-09 15:16) [0]Обмен данными по локальной сети
Подскажите, пожалуйста!
У меня есть Модуль CrtSock для работы с Socket.
К ниму прилагаются модули HTTPSock, FTPSock...
Но мне нужно обмениваться сообщениями по локальной сети.
Можно ли как-нибудь с помощью CrtSock сделать программу Client
и программу Server. И если да то где можно посмотреть какой-нибудь
пример. А если он не подходит то посоветуйте пожалуйста,
как можно решить эту задачу без использования Компонентов TServerSocket,
TNMSTRM и т.д.
← →
Digitman © (2005-09-09 15:28) [1]
> Можно ли как-нибудь с помощью CrtSock сделать программу
> Client
наверно можно ... знать бы только, что из себя представляет CrtSock и откуда он взялся ..
> мне нужно обмениваться сообщениями по локальной сети
нет проблем.
на то и лок.сеть.
только вот использование именно гнезд в лок.сети вовсе не обязательно
> Можно ли как-нибудь с помощью CrtSock сделать программу
> Client
> и программу Server
без полного понимания содержимого этого самого CrtSock ответить на вопрос невозможно
> если он не подходит то посоветуйте пожалуйста,
> как можно решить эту задачу без использования Компонентов
> TServerSocket,
> TNMSTRM и т.д.
пакет компонентов INDY (INternet Direct), например, поможет тебе с легкостью решить все твои клиентские и серверные задачи безо всяких CrtSock и TClient/ServerSocket.
← →
Ylia___ (2005-09-09 15:46) [2]CrtSock лежит здесь
http://pascal.sources.ru/delphi/internet/crtsock.zip
в нем есть пример:
// UDP
{
function StartBroadCast(Port:word):integer;
function SendBroadCast(Server:integer; Port:word; s:string):integer;
function SendBroadCastTo(Server:integer; Port:word; ip,s:string):integer;
function ReadBroadCast(Server:integer; Port:word):string;
function ReadBroadCastEx(Server:integer; Port:word; var ip:string):string;
}
procedure TForm1.BroadcastClick(Sender: TObject);
var
p:integer;
begin
p:=StrToInt(Port.Text);
if (Port.Tag<>p) then begin
if Broadcast.Tag>0 then begin
CloseSocket(Broadcast.Tag);
Broadcast.Tag:=0;
end;
Port.Tag:=p;
end;
if Broadcast.Tag<=0 then Broadcast.Tag:=StartBroadcast(p);
if Broadcast.Tag<0 then
ShowMessage("can""t open socket :(")
else
SendBroadCast(Broadcast.Tag,StrToInt(edListen.Text),edBroadcast.Text);
end;
procedure TForm1.ActiveClick(Sender: TObject);
begin
if Active.Checked then begin
Active.Tag:=StrToInt(edListen.Text);
UDPTimer.Tag:=StartBroadcast(Active.Tag);
if UDPTimer.Tag<0 then begin
ShowMessage("Can""t open socket :(");
Active.Checked:=False;
end else begin
UDPTimer.Enabled:=True;
edListen.Enabled:=False;
end;
end else begin
UDPTimer.Enabled:=False;
CloseSocket(UDPTimer.Tag);
edListen.Enabled:=True;
end;
end;
procedure TForm1.UDPTimerTimer(Sender: TObject);
begin
if SockAvail(UDPTimer.Tag)>0 then begin
Listen.Caption:=ReadBroadcast(UDPTimer.Tag,Active.Tag);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Broadcast.Tag>0 then CloseSocket(Broadcast.Tag);
end;
А это не подойдет?
>пакет компонентов INDY
Но INDY это тоже компоненты, а мне бы
хотелось напрямую без компонентов
← →
Digitman © (2005-09-09 16:07) [3]
> А это не подойдет?
а я почем знаю ?)
тебе видней, подойдет или не подойдет ... документация-то поди какая-никакая есть у производителя этого шедевра под названием CrtSock .. вот и глянь в нее ..
> мне бы
> хотелось напрямую без компонентов
чем тебе компоненты так насолили ?)
они, компоненты, на то и существуют, чтобы ускорить разработку приложения ..
← →
Ylia___ (2005-09-09 16:17) [4]>документация-то поди какая-никакая есть у производителя этого >шедевра
Нет.
>чем тебе компоненты так насолили ?)
Клиентское приложение не нуждается в форме.
Зачем я буду делать программу в 300 Kb,
когда можно обойтись 25Kb. (Но это не вредоносная программа!)
← →
Digitman © (2005-09-09 16:22) [5]
> Ylia___ (09.09.05 16:17) [4]
> Нет.
если исходников к тому же нет , то сразу - в топку такой шедевр.
> Клиентское приложение не нуждается в форме
на здоровье.
никто и ничто не заставляет тебя создавать форму.
> Зачем я буду делать программу в 300 Kb,
> когда можно обойтись 25Kb
при современных емкостях файловых носителей и RAM разница между 25 и 300 - курам на смех.
> это не вредоносная программа
раз не вредоносная, значит нет резона искать сомнительную выгоду в разнице занимаемого дискового пространства на носителе.
← →
Ylia__ (2005-09-09 17:11) [6]>если исходников к тому же нет , то сразу - в топку такой шедевр
Почему? исходники есть, примеры есть и работает всё.
CrtSock components by Paul TOTH
Какой-то француз пишет.
Я вот только не пойму, как в функции StartBroadcast
указать имя компьютера которому посылается сообщение
например имя "Computer2", а как его преобрадовать в LongInt?
TSockAddr=packed record
Family:word;
Port:word;
Addr:LongInt;
Zeros:array[0..7] of byte;
end;
SockAddr.Family:=Internet;
SockAddr.Port:=swap(Port);
// SockAddr.Addr:=0; ?
← →
Digitman © (2005-09-09 17:16) [7]
> исходники есть, примеры есть и работает всё
значит разобраться, реализованы ли в данно юните "серверные" алгоритмы - не проблема.
> не пойму, как в функции StartBroadcast
> указать имя компьютера которому посылается сообщение
да никак !
на то и бродкаст, что сообщение рассылается широковещательно, т.е. отсылается не конкретному адресату, а всем потенциально присутствующим адресатам в указанной сети
← →
Ylia__ (2005-09-09 17:39) [8]function StartBroadCast(Port:word):integer;
Var
SockAddr:TSockAddr;
bc:integer;
begin
Result:=socket(Internet,Datagrams,17); // 17 for UDP ... work also with 0 ?!
if Result=-1 then exit;
FillChar(SockAddr,SizeOf(SockAddr),0);
SockAddr.Family:=Internet;
SockAddr.Port:=swap(Port);
// SockAddr.Addr:=0; ?
bc:=SO_BROADCAST;
if (Bind(Result,SockAddr,SizeOf(SockAddr))<>0)
or (setsockopt(Result,SOL_SOCKET,SO_BROADCAST,bc,SizeOf(bc))<>0) then begin
CloseSocket(Result);
Result:=-1;
end;
end;
function SendBroadCast(Server:integer; Port:word; s:string):integer;
Var
SockAddr:TSockAddr;
begin
SockAddr.Family:=Internet;
SockAddr.Port:=swap(Port);
SockAddr.Addr:=-1;
Result:=SendTo(Server,@s[1],length(s),0,SockAddr,SizeOf(SockAddr)); end;
Вместо SockAddr.Addr:=-1; я ставлю HostToLong("Computer2") -
работает.
Интересно - нужно ли ещё что-то менять, например
SO_BROADCAST на что-то другое. Если мне не нужно посвлать сразу всем.
← →
Ylia__ (2005-09-09 17:53) [9]Нашёл!
function SendBroadCastTo(Server:integer; Port:word; ip,s:string):integer;
Var
SockAddr:TSockAddr;
begin
SockAddr.Family:=Internet;
SockAddr.Port:=swap(Port);
SockAddr.Addr:=IpToLong(ip);
Result:=SendTo(Server,@s[1],length(s),0,SockAddr,SizeOf(SockAddr));
end;
Страницы: 1 вся ветка
Текущий архив: 2005.10.02;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.027 c