送分了,快来抢!:关于发送UDP广播报文的问题???(150分)

  • 主题发起人 主题发起人 王欣寓
  • 开始时间 开始时间

王欣寓

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟有两种想法,一种是用TNMUDP控件,但发送广播时需不需要利用setsockopt函数设置
广播选项,如果需要,那么该函数的第一个参数怎么获得呢?如果那么热心的大哥有该控件的
广播实例,能否给俺一份。
另外,我想用winsock API实现,但是,老是在sendto函数那儿卡壳,程序如下:
procedure SndBrdPkt;
var
ssndBrd:TSOCKET;
sndto:TSockAddrIn;
TempVar,TempVar1,TempVar2,TempVar3:integer;
begin
ssndBrd:=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
if ssndBrd=INVALID_SOCKET then
exit;
TempVar:=1;
BuildBrdPkt(@LocalHostIPAddr);//组成广播报文
//填充SockAddrIn结构
with sndto do
begin
sin_family:=PF_INET;//协议族
sin_port:=PUB_BrdPort;//发送端口
sin_Addr.S_Addr:=htonl(INADDR_BROADCAST);//广播地址
end;
setsockopt(ssndBrd,SOL_SOCKET,SO_BROADCAST,@TempVar,sizeof(TempVar));
// TempVar1:=sizeof(BrdPkt);
TempVar2:=0;
TempVar3:=sizeof(sndto);
TempVar:=sendto(ssndBrd,pChar(@BrdPkt),TempVar1,TempVar2,@sndto,sizeof(sndto));
end;
编译的时候老是出现constant object can not be passed as var parameters.

 
setsockopt 中 PChar(@TempVar)
sendto中 @sndto 改为sndto
BrdPkt好象不需要加@,否则我想会出错
 
谢谢PiPi,编译已通过,确实原因在sndto,不过为什么sndto前面的取地址符号@要去掉?
Delphi里面的指针究竟是怎么一回事?
 
sendto在delphi中的定义是这样的:
function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;
tolen: Integer): Integer; stdcall;
请注意 var addrto
^^^
delphi中关于var定义参数的帮助是这样的:
Most parameters are either value parameters (the default) or variable (var) parameters. Value parameters are passed by value, while variable parameters are passed by reference. To see what this means, consider the following functions.

function DoubleByValue(X: Integer): Integer; // X is a value parameter

begin
X := X * 2;
Result := X;
end;

function DoubleByRef(var X: Integer): Integer; // X is a variable parameter

begin
X := X * 2;
Result := X;
end;
_______________________________________
var

I, J, V, W: Integer;
begin
I := 4;
V := 4;
J := DoubleByValue(I); // J = 8, I = 4
W := DoubleByRef(V); // W = 8, V = 8
end;
 
一人一半。哈哈
 
到我的主页http://delphis.yeah.net 上下载一个NetICQ的源程序吧,这是用TNMUDP做的
用于局域网聊天的东西,有你需要的广播方法。
 
后退
顶部