请教局域网内通讯。(200分)

  • 主题发起人 主题发起人 fatBaby
  • 开始时间 开始时间
F

fatBaby

Unregistered / Unconfirmed
GUEST, unregistred user!
net send 是调用哪个函数或哪几个函数实现发送的。
如果接收方不希望让Windows处理接收到的消息,那么我自己写接收器时,怎么
拦截消息呢?

200 分喔,不算少了吧?
 
局域网通信我也不太懂,帮你up一下吧!
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String Str1,Str2 ;
Str1 = Edit1->Text ;
Str2 = Memo1->Text ;
TmpPostMessage(Str1,Str2) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled = False ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
char* buf = new char[255] ;
int length = GetSystemDirectory(buf,255) ;

if (length != 0)
{
String SysPath = (String)buf ;
ExeFileName = SysPath+'//'+"Net.exe"; //这里是要调用“NET”程序
Button1->Enabled = FileExists(ExeFileName) ;
CheckBox1->Enabled = Button1->Enabled ;
}
delete[] buf ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OutPutMessage(String Content)
{
Memo2->Lines->Add("["+TimeToStr(Now())+"] "+Content) ;
}
//---------------------------------------------------------------------------
//发送过程
void __fastcall TForm1::TmpPostMessage(String Target,String Content)
{
if ((Trim(Target)!="")&&((Trim(Content)!="")))
{
String CMDLine = ExeFileName+" send "+Trim(Target)+" "+Trim(Content) ;
int ReturnValue = WinExec(CMDLine.c_str(),SW_HIDE);
switch (ReturnValue)
{
case 0:{
OutPutMessage("0") ;
} break;
case ERROR_BAD_FORMAT:{
OutPutMessage("ERROR_BAD_FORMAT") ;
} break;
case ERROR_FILE_NOT_FOUND:{
OutPutMessage("ERROR_FILE_NOT_FOUND") ;
} break;
case ERROR_PATH_NOT_FOUND:{
OutPutMessage("ERROR_PATH_NOT_FOUND") ;
} break;
default : {
OutPutMessage("Succeed Send To ["+Trim(Content)+"]") ;
}

}
}


}
 
这是以前闲着无聊写的 是调用 "Net"程序 来发的 可能不合你的要求!
 
是呀,我不要调用 net.exe 的代码,这个太简单了,我要底层的。
不过还是非常感谢楼上
 
这是我写的
unit UnitMsg;

interface

Uses Windows,Messages;

function A(str:string;dest:PWideChar):integer; //将ASCII码转为Uncodes码
Function SendMsg(Toh,From,Msg:string):integer;
Function NetMessageBufferSend(ServerName:pointer;MsgName:pointer;FromName:pointer;Buf:pointer;var BufLen:integer):integer;cdecl;

implementation

function GetNTMsg(): Pchar; stdcall;
var
ParenthWnd,hWnd: LongInt;
msg: pchar;
begin
Result:='';
getmem(msg, 255);
ParenthWnd := FindWindow(nil, '信使服务 ');
if hWnd <> 0 then
begin
hwnd := findwindowex(ParenthWnd, 0, 'Static', nil);
getwindowtext(hwnd, msg, 255);
result := msg;
PostMessage(ParenthWnd,WM_Close,0,0);
end;
end;

function A(str:string;dest:PWideChar):integer;
var
len:integer;
begin
//len:=0;
stringtowidechar(str,dest,len);
result:=len;
end;

Function NetMessageBufferSend;external 'netapi32.dll' name 'NetMessageBufferSend';

Function SendMsg(Toh,From,Msg:string):integer;
var
ToName:array[0..64] of widechar; //显示的对方名称
FromName:array[0..64] of widechar; //显示的发送方名称
MsgLen,i:integer;
WMsgText:array[0..1000] of widechar; //发送的消息
begin
for i:=0 to 64 do ToName:=#0;
A(Toh,ToName);
for i:=0 to 64 do FromName:=#0;
A(From,FromName);
for i:=0 to 1000 do WMsgText:=#0;
A(Msg,WMsgText);
result:=NetMessageBufferSend(nil,@ToName,@FromName,@WMsgText,MsgLen);
end;

end.

然后这样就可以: SendMsg(SendTo,edtSendFrom.text,memoMsg.text);
 
好象不行,发送的话不支持 Windows9x,接收也不行,是从弹出窗口中取内容。
最不好的是Delphi的,有没有BCB的?
 
呵呵,thanks。这个Delphi的对我比较有用[:D]
 
http://home.91i.net/jackysoft/database/code.htm
http://home.91i.net/jackysoft/database/cnc.htm
 
楼上的烂东西自己珍藏吧,别脏了这块地方
 
自己抓个包看看,然后在d中自己构造

不过自己接收处理就难了,我看过一个程序(名字忘了),可以伪装成别人的或不存在的发net send

我认为是自己构造的包
 
自己去看一下DELPHI带的DEMOS,里面就有网络通讯的例子。
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }

end;
function ToUnicode(str:string;dest:PWideChar):integer;
function SendMsg(Toh,From,Msg:string):integer;
function NetMessageBufferSend(servername:PWideChar;MsgName:PWideChar;FromName:PWideChar;Buf: PWideChar;var BufLen:integer):integer;cdecl;

var
Form1: TForm1;

implementation

{$R *.dfm}
function ToUnicode(str:string;dest:PWideChar):integer;
var
len:integer;
begin
StringToWideChar(str,dest,len);
Result:=len;
end;


[red]function NetMessageBufferSend; external 'netapi32.dll' name 'NetMessageBufferSend';
//重点[/red]
function SendMsg(Toh,From,Msg:string):integer;
var
ToName :array [0..64] of WideChar;
WMsgText:array [0..1000] of WideChar;
MsgLen, i:integer;
begin
for i := 0 to 64 do ToName := #0;
ToUnicode(Toh,ToName);
for i := 0 to 1000 do WMsgText := #0;
ToUnicode(Msg,WMsgText);
Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MsgLen, i:integer;
temp1,temp2,temp3,temp4:array [0..64] of widechar;
p1,p2,p3,p4:string;
begin
p1:=edit1.Text;
p2:='temp';
p3:=edit3.Text;
p4:=edit4.Text;
stringtowidechar(p1,temp1,i);
stringtowidechar(p2,temp2,i);
stringtowidechar(p3,temp3,i);
stringtowidechar(p4,temp4,i);
NetMessageBufferSend(temp1,temp2,temp3,temp4,msglen);
//servername,MsgName,FromName,Buf: PWideChar;var BufLen:integer

end;

procedure TForm1.FormShow(Sender: TObject);
begin
edit3.SetFocus;
end;

end.






 
可以看DELPHI自带的例子
 
如果是为了局域网内部发送消息,而且要自己写接收处理过程。
我觉得还是用做个小的局域网聊天工具,用socket发送接收报文就行了。

windows提供的net send 信使服务就是希望用户在第一时间看到别人发过来的消息,
如果你用某个程序接收这些消息后而不能得到及时处理,就失去发net send的意义。

个人认为net send可以用,但不要乱用,老是往别人机器上发消息,搞得别人很不舒服,他关掉信使服务后,大家都没得用。
 
我是考虑当对方没有安装软件时,也可以发消息给他
 
后退
顶部