Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1126154546
Big Joe
2005-09-08 08:42
2005.10.02
XPManifest1 не хочет исчезать


9-1117088731
Архитектор
2005-05-26 10:25
2005.10.02
[Delphi, GLScene] Оптимизация...


14-1126509878
pazitron_brain
2005-09-12 11:24
2005.10.02
Ви сайтес!


8-1116226738
anat
2005-05-16 10:58
2005.10.02
OpenGl need HELP


2-1124967572
ROCKER***
2005-08-25 14:59
2005.10.02
scrolling в TMemo