简单问题发问:就是用udp广播,然后显示其ip地址和主机名(50分)

  • 主题发起人 主题发起人 shchen
  • 开始时间 开始时间
S

shchen

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟刚学delphi,虽然看了很多udp的方面的资料,但还是不能做出来。希望能有实现的程序。
需求如下:一个server,一个client;client登陆后发送udp广播,通知sever其ip和主机名,然后server
收到包后在一个列表中显示。由于在局域网中,sever的是不是也该发udp广播,使其它的client知道其ip呢?
 
发广播,Client通过RecvFrom知道是哪个IP发过来的数据包
 
可以具体做一个程序吗?我实在做不出来啊,谢谢了
 
to:张无忌
该程序可以在单机时调试通过,如果把学生机版的nmudp1.RemoteHost改成‘255.255.255.255’
在教师机版不能显示学生机的ip,为什么?还有该程序不知哪里还有bug,请指点一下。谢谢了。




学生机版:
procedure TForm1.FormCreate(Sender: TObject);
var
MyStream: TMemoryStream;
C: String;

begin
edit1.Text:=nmdaytime1.LocalIP;
c:=edit1.Text;
nmudp1.RemoteHost:='172.16.92.20';
nmudp1.RemotePort:=6688;
nmudp1.LocalPort:=8866;
mystream:=tmemorystream.Create;
try
MyStream.Write(C[1], Length(C));
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;


end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
C: String;
MyStream: TMemoryStream;
begin

MyStream := TMemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);
SetLength(C, NumberBytes);
MyStream.Read(C[1], NumberBytes);
memo1.Lines.Add(c);
memo1.Lines.Add(fromip);
finally
mystream.Free;
end;
end;

procedure TForm1.NMUDP1DataSend(Sender: TObject);
begin
memo1.Lines.Add('data has been sent');
end;
教师机版:
unit teacher;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
Label2: TLabel;
NMUDP1: TNMUDP;
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var
C: String;
MyStream: TMemoryStream;

begin
MyStream := TMemoryStream.Create;
try
NMUDP1.ReadStream(MyStream);



Memo1.Lines.Add(FromIP);
finally
MyStream.Free;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
nmudp1.LocalPort:=6688;
nmudp1.RemotePort:=8866;
end;

end.
 
把‘255.255.255.255’改成‘172.16.92.255’调试通过了。
 
请问高手们,如何从一个菜鸟变成高手?问题太大了点,就你们的经验,可以做哪方面的工作呢?看哪些资料?有什么好的ELPHI网络编程的书籍推荐一下吗?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1605817
三:网络数据广播
首先要指出的是,广播是只有UDP协议才支持的,TCP是无法进行广播的.广播分为两种,一种是directed broadcast.<<谈Delphi编程中“流”的应用>>实际应用之三:利用流制作自己的OICQ中已经说的很详细了,下面摘录下来给大家:UDP协议还有一个很大的好处就是可以广播,就是说处于一个网段的都可以接收到信息而不必指定具体的IP地址。网段一般分A、B、C三类,
1~126.XXX.XXX.XXX (A类网) :广播地址为XXX.255.255.255
128~191.XXX.XXX.XXX(B类网):广播地址为XXX.XXX.255.255
192~254.XXX.XXX.XXX(C类网):广播地址为XXX.XXX.XXX.255
比如说三台计算机192.168.0.1、192.168.0.10、192.168.0.18,发送信息时只要指定IP地址为192.168.0.255就可以实现广播了。下面给出一个转换IP为广播IP的函数,快拿去完善自己的OICQ吧^-^.

Function Trun_ip(S:string):string;
var s1,s2,s3,ss,sss,Head:string;
n,m:integer;
begin
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;
另外一种是limited broadcast,广播地址是255.255.255.255.它的好处是只要在同一子网中的主机,就可以收到这种广播,而不必非要在统一逻辑子网中.例如,如果你的地址是192.168.0.1,那么这种广播,地址是192.202.30.17的主机也能收到.本文将使用此种广播.
在Delphi中使用UDP广播可以用控件,也可以API.本文中将完全使用API来实现.
 
谢谢了,接受答案了。
 
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
begin
//fromip就是对方的IP地址!PORT是端口
end;
 
后退
顶部