怎么发广播包(100分)

  • 主题发起人 主题发起人 a_ping
  • 开始时间 开始时间
A

a_ping

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi带的clientSocket能发广播包吗,怎么搞??急!!最好有源码!!先谢谢各位了!!
如果不行,那我怎么发呢,这个广播包是要带自己定义的数据包的
 
实际上你将包发往IP广播地址就可以了,如你使用192.168.0.0网段,则发往
192.168.0.255即可。
 
lw86 说的是一般的情况,但是如果子网掩码不是 255.255.255.0 就不对了
比如子网掩码是 255.255.255.128,那么广播地址就是 192.168.0.127

当然了,对于一般的情况,就是把最后一段改成 255 就可以了。
 
注意Delphi带的ClientSocket和ServerSocket用的是TCP,广播要用UDP。
 
对,一定要用NMUDP控件地

可以向192.168.0.255发送,就表示向所有机器发送消息,即广播
 
看下面的代码:(绝对可行!!!)
如果在同一网段可以看看下面的代码!
服务器:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
NMUDP1.SendBuffer(xkeyword,6);
end;
服务器还可以将自己的IP广播出去
要代码我可以给你
客户端可以如下
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
begin

flagip:=FromIp;
NMUDP1.ReadBuffer(xkeyword,numberbytes);//监听

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
SocketConnection1.Address:=flagip;
if(xkeyword='starip')then
begin
SocketConnection1.Connected:=true;
flagstar:=1;
Timer2.Enabled:=false;
timer3.Enabled:=true;
//判断是否连接'连接成功'
end;
end;
 
楼上的方案可行,用FastNet控件板中的NMUDP控件。
 
试试这段代码
服务器端用代码
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
begin

flagip:=FromIp;//这句话就可以达到客户端的IP
NMUDP1.ReadBuffer(xkeyword,numberbytes);
//xkeyword 就是你要广播的内容!
end;
客户端的广播代码
procedure TForm1.Timer2Timer(Sender: TObject);
begin
NMUDP1.SendBuffer(xkeyword,6);//发送广播
end;
注意设置NMUDP1的一些属性
 
用UDP,在FastNet选项卡上NMUDP
procedure TForm1.senddata(Tmpstr:string);
var
MyStream:TMemoryStream;
lth:integer;
begin
//调试中去掉信息加密
NMUDP1.ReportLevel:=Status_Basic;
NMUDP1.RemoteHost:=192.168.255.255//前两端是网端,后两个255代表C类网广播,
192.168.0.255//前三端是网端,后面的255就代表B类网广播
NMUDP1.RemotePort:=4546;//端口自己定
MyStream:=TMemoryStream.Create;
lth:=length(tmpstr);
try
MyStream.Write(TmpStr[1],lth);
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
end;
//接收各种信息的处理
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream:TmemoryStream;
TmpStr:string;
begin
Mystream:=TmemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);
SetLength(Tmpstr,NumberBytes);
Mystream.Read(TmpStr[1],NumberBytes);
showmessage(tmpstr);
finally
MyStream.free;
end;
end;
 
我用NMUDP发广播包,那服务器端ServerSocket有什么要求,能收吗
 
我赞同上面方法
 
服务端也用UDP接受,用UDP属性窗口中的EVENT选项卡中的OnDatareceived事件,
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
MyStream:TmemoryStream;
TmpStr:string;
begin
Mystream:=TmemoryStream.Create;//接收到的流
try
NMUDP1.ReadStream(MyStream);
SetLength(Tmpstr,NumberBytes);
Mystream.Read(TmpStr[1],NumberBytes);//TmpStr就是接受到的字符串
finally
Mystream.free;
end;
end;
 
uses Winsock;
function GetBroadCastIp:string;
function LocalIP: string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;

begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
result:=StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;
var s,s1,s2,s3,ss,sss,Head:string;
n,m:integer;
begin
s:=LocalIP;
sss:=s;
n:=pos('.',s);
s1:=copy(s,1,n);
m:=length(s1);
delete(s,1,m);
Head:=copy(s1,1,(length(s1)-1));
n:=pos('.',s);
s2:=copy(s,1,n);
m:=length(s2);
delete(s,1,m);
n:=pos('.',s);
s3:=copy(s,1,n);
m:=length(s3);
delete(s,1,m);
ss:=sss;
if strtoint(Head) in [1..126] then ss:=s1+'255.255.255'; //1~126.255.255.255 (A类网)
if strtoint(Head) in [128..191] then ss:=s1+s2+'255.255';//128~191.XXX.255.255(B类网)
if strtoint(Head) in [192..254] then ss:=s1+s2+s3+'255'; //192~254.XXX.XXX.255(C类网)
Result:=ss;
end;
 
jingtao和浮生,看了你们的代码,感觉有一定深度,有一个问题问题一直困劳着我,那就是
qq里有一个“二人世界”的功能,这个功能如果用delphi实现的话,
我想在局域网里用socketServer和socketClient应该很
容易实现,但在因特网里该如何实现呢,那位大虾能够写一段代码演示一下,
只要实现聊天的功能就行了。但一定是两台不在同一个局域网里的机器实现对话的功能。
 
to 浮生:
你说的方法,我老早就用过,可出现个问题,我一发送,就什么反应都没有,怎么搞的?
网络好的,而且我试的是自发自收都不成
 
关于UDP广播,我在
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1125210
里已经说得很明白了。里面也给出了代码。
 
后退
顶部