Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Как передать сообщение по сети?   Найти похожие ветки 

 
TankMan ©   (2004-02-09 20:25) [0]

Я тут слышал от своего друга, что программка одна может отправлять по сети простые текстовые сообщения на другой компьютер, причем никаких клиентов не нужно на удаленном компьютере(?!?!) - но факт есть факт... так что вопрос...может кто знает, как это можно реализовать? и самое интересное, что это работает еще и на 98...


 
Rouse_ ©   (2004-02-09 20:57) [1]

Так называемые мэйлслоты...
Про клиенты - это конечно перебор, как минимум кто-то должен слушать мэйлслот, будь то служба сообщений, WinPopUp либо другая программа, работающая по данному принципу...

Вот два примера отправки:

Для 98:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Spin;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   Label4: TLabel;
   SpinEdit1: TSpinEdit;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 MSHandle: THandle;
 MSMessage: array [0..2] of String;
 ResultMsMessage: String;
 MSWrite: DWORD;
 ServerName: String;
begin
 ServerName := Edit1.Text;
 if ServerName = "" then ServerName := "*\";
 if ServerName[Length(ServerName)] <> "\" then ServerName := ServerName + "\";

 MSHandle := CreateFile(PChar("\\" + ServerName + "mailslot\messngr"),
   GENERIC_WRITE, // or GENERIC_READ,
   FILE_SHARE_READ,
   nil,
   OPEN_EXISTING,
   FILE_ATTRIBUTE_NORMAL,
   0);
 if not Win32Check(MSHandle <> INVALID_HANDLE_VALUE) then Exit;

 MSMessage[0] := Edit2.Text;
 MSMessage[1] := Edit3.Text;
 MSMessage[2] := Memo1.Text;

 CharToOem(PChar(MSMessage[0]), PChar(MSMessage[0]));
 CharToOem(PChar(MSMessage[1]), PChar(MSMessage[1]));
 CharToOem(PChar(MSMessage[2]), PChar(MSMessage[2]));

 ResultMsMessage := MSMessage[0] + #0 + MSMessage[1] + #0 + MSMessage[2];
 // Максимум отправляется 424 символа
 // В нетсенде данного ограничения нет
  ResultMsMessage := ResultMsMessage + StringOfChar(" ", SpinEdit1.Value - Length(ResultMsMessage));

 WriteFile(MSHandle, Pointer(PChar(ResultMsMessage))^, Length(ResultMsMessage), MSWrite, nil);
 Win32Check(MSWrite = Length(ResultMsMessage));
 CloseHandle(MSHandle);
end;

end.


и для NT:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

const
NetApi32 = "NetApi32.dll";
 function NetMessageBufferSend(
      servername:PWideChar ;
      msgname:PWideChar ;
      fromname:PWideChar ;
      buf:PWideChar ;
      buflen:DWORD):DWORD;stdcall;

var
 Form1: TForm1;

implementation

function NetMessageBufferSend; external NetApi32 name "NetMessageBufferSend";

{$R *.dfm}

Function SendLanMessage(FromName,ToName:String;Text:String):Boolean;
Var
RName,TName,HostName: LPCWSTR;
buf: Pointer;
size: Integer;
Begin
Result:=True;
HostName:=nil;

size := SizeOf (WideChar) * Length (FromName)+1;
GetMem (RName, Size);
RName :=StringToWideChar (FromName, RName, Length (FromName)+1);
size := SizeOf (WideChar) * Length (ToName)+1;
GetMem (TName, Size);
TName :=StringToWideChar (ToName, TName, Length (ToName) + 1);

// Перевод String в WideString
size := SizeOf (WideChar) * Length (text)+1;
GetMem (buf, Size);
  TRY
    PWideChar (Buf) := StringToWideChar (text, buf, Length (text) + 1);
    If NetMessageBufferSend (HostName, rname, tname, buf, size) <> NO_ERROR
      then  Result:=False;
  FINALLY
    FreeMem(buf);
    IF assigned(TNAME) then FreeMem(TName);
    IF assigned(RNAME) then FreeMem(RName);
    IF assigned(HOSTNAME) then FreeMem(HOSTNAME);
  END;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SendLanMessage(<кому>, <от кого>, <сообщение>);
end;

end.


Так же в NT можно выполнить команду net send <Имя компьютера> <Сообщение>

Делаю успехов


 
Rouse_ ©   (2004-02-09 20:58) [2]

ЗЫ: В смысле Желаю успехов ;)


 
DVM ©   (2004-02-09 21:21) [3]


> причем никаких клиентов не нужно на удаленном компьютере(?!?!)
> - но факт есть факт...

в 2000/XP есть служба Network Messenger (Служба сообщений, не путать с Messenger). Она и принимает. Так что клиент все же есть.
В 98 этого нет. Там WinPopup должна быть запущена например.


 
DeadMeat ©   (2004-02-10 15:24) [4]

Удалено модератором


 
TankMan ©   (2004-02-10 18:08) [5]

WinPopUP говоришь?...странно, нужно будет самому лично посмотреть на эту программку..(ту что "без всяких клиентов запускает".), может действительно у того пацана была winpopup запущена..
А вообще спасибо за пример...(еще не пробовал его правда :) )...но всеравно спасибо :)



Страницы: 1 вся ветка

Текущий архив: 2004.04.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
14-1079599373
Pitt
2004-03-18 11:42
2004.04.18
Помогите ламеру загрузить БД!


6-1077015533
Neznayka
2004-02-17 13:58
2004.04.18
Сканирование сети


14-1080460409
Шнур
2004-03-28 11:53
2004.04.18
реинжиниринг


8-1073328665
Ilya
2004-01-05 21:51
2004.04.18
Аналог процедуры Sound в Delphi


14-1080116643
Alex_Bredin
2004-03-24 11:24
2004.04.18
Еврофутбол