请大家帮忙测试一个程序。$300(300分)

  • 主题发起人 主题发起人 远帆
  • 开始时间 开始时间

远帆

Unregistered / Unconfirmed
GUEST, unregistred user!
由于对局域网进行Udp广播需要知道广播地址。这就要求取出自已IP和子网掩码(mask)
但winsock只能取得ip,不能取得mask。其实相关信息都在注册表中,但是nt和9x系统并
不太一样。我做了一个程序用于取得mask,希望大家帮我测试一下,看看在不同的情况下
是否能达到要求。
程序可以在http://www.xindkj.com/getmask.rar下载(148K)
嫌分少的话,http://www.delphibbs.com/delphibbs/dispq.asp?lid=1118202
里的也可以给。
谢谢大家帮忙,如果需要,我也可以公开源码。
 
远帆呀,看看这个,也许对你有用。
unit USock;
interface
uses Windows, Winsock;
{
使用到WinSock2。
这是一个完整的Delphi单元,将它加入到你的工程中,你可以调用:
EnumInterfaces(var s string): Boolean;
来返回所有IP地址、网络掩码、广播地址和连接状态。
此函数列举出所有的TCP/IP连接,并返回一个由回车换行(CRLF)符分隔的字符串,包含以下信息:
IP, NetMask, BroadCast-Address, Up/Down status,
Broadcast support, Loopback
如果你将这个字符串赋给TMemo(它的Memo.Lines.Text属性),你可以看到更清晰的结果。
使用此函数,你需要Win98/ME/2K, 95 OSR 2 或者NT service pack #3,
因为程序会使用到WinSock 2(WS2_32.DLL)。}
function EnumInterfaces(var sInt: string): Boolean;
{从Winsock 2.0导入函数WSAIOCtl -- 在Win98/ME/2K and 95 OSR2, NT srv pack #3下才有Winsock 2}
function WSAIoctl(s: TSocket;
cmd: DWORD;
lpInBuffer: PCHAR;
dwInBufferLen: DWORD;
lpOutBuffer: PCHAR;
dwOutBufferLen: DWORD;
lpdwOutBytesReturned: LPDWORD;
lpOverLapped: POINTER;
lpOverLappedRoutine: POINTER): Integer;
stdcall;
external 'WS2_32.DLL';
{Constants taken from C header files}
const
SIO_GET_INTERFACE_LIST = $4004747F;
IFF_UP = $00000001;
IFF_BROADCAST = $00000002;
IFF_LOOPBACK = $00000004;
IFF_POINTTOPOINT = $00000008;
IFF_MULTICAST = $00000010;
type
sockaddr_gen = packed record
AddressIn: sockaddr_in;
filler: packed array[0..7] of char;
end;

type
INTERFACE_INFO = packed record
iiFlags: u_long;
// Interface flags
iiAddress: sockaddr_gen;
// Interface address
iiBroadcastAddress: sockaddr_gen;
// Broadcast address
iiNetmask: sockaddr_gen;
// Network mask
end;

implementation
{
1. 打开Winsock
2. 创建一个socket
3. 调用WSAIOCtl获取网络连接
4. 对每个连接,获取它的IP、掩码、广播地址、状态
5. 将信息填充到一个由CDLF分隔的字符串中
6. 结束}

function EnumInterfaces(var sInt: string): Boolean;
var
s: TSocket;
wsaD: WSADATA;
NumInterfaces: Integer;
BytesReturned, SetFlags: u_long;
pAddrInet: SOCKADDR_IN;
pAddrString: PCHAR;
PtrA: pointer;
Buffer: array[0..20] of INTERFACE_INFO;
i: Integer;
begin
result := true;
// Initialize
sInt := '';
WSAStartup($0101, wsaD);
// Start WinSock
// You should normally check
// for errors here :)
s := Socket(AF_INET, SOCK_STREAM, 0);
// Open a socket
if (s = INVALID_SOCKET) then
exit;
try // Call WSAIoCtl
PtrA := @bytesReturned;
if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,
nil)
<> SOCKET_ERROR) then
begin
// If ok, find out how
// many interfaces exist
NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
for i := 0 to NumInterfaces - 1 do
// For every interface
begin
pAddrInet := Buffer.iiAddress.addressIn;
// IP ADDRESS
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt := sInt + ' IP=' + pAddrString + ',';
pAddrInet := Buffer.iiNetMask.addressIn;
// SUBNET MASK
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt := sInt + ' Mask=' + pAddrString + ',';
pAddrInet := Buffer.iiBroadCastAddress.addressIn;
// Broadcast addr
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt := sInt + ' Broadcast=' + pAddrString + ',';
SetFlags := Buffer.iiFlags;
if (SetFlags and IFF_UP) = IFF_UP then
sInt := sInt + ' Interface UP,' // Interface up/down
else
sInt := sInt + ' Interface do
WN,';
if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then
// Broadcasts
sInt := sInt + ' Broadcasts supported,' // supported or
else
// not supported
sInt := sInt + ' Broadcasts NOT supported,';
if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then
// Loopback or
sInt := sInt + ' Loopback interface'
else
sInt := sInt + ' Network interface';
// normal
sInt := sInt + #13#10;
// CRLF between
// each interface
end;
end;
except
end;
//
// Close sockets
//
CloseSocket(s);
WSACleanUp;
result := false;
end;

end.
 
谢谢你,yzhshi。
这段代码我看过,也试过,起码在我的计算机上得不到真实掩码。
我的是255.255.255.0而它得到的都是255.255.255.255,跟据这个
值,我怎么去广播呢。
所以才花了很多功夫去读注册表啊。
 
我的可以的,我计算机WinMe,我就到Windows 2000下实验一下。
 
向欲广播网段的最后一个IP发送消息包就是实现广播
比如你的机器ip是192.168.5.10
掩码是255.255.255.0
那么你的广播IP就是192.168.5.255
 
Windows 2000可以的。我再到Win98、XP下实验。
 
呵呵 ,Windows 98第二版也可以。
我就要到xp下实验了,可惜,我必须重新启动计算机,稍等……
 
to Cowry:
这个我知道啊,问题是,你如何取得mask=255.255.255.0?
to yzhshi:
你说的是我的程序还是你贴的那段代码?
 
没问题呀。
IP=127.0.0.1, Mask=255.0.0.0, Broadcast=255.255.255.255, Interface UP, Broadcasts supported, Loopback interface
IP=166.100.100.128, Mask=255.255.255.0, Broadcast=255.255.255.255, Interface UP, Broadcasts supported, Network interface
IP=160.160.160.128, Mask=255.255.255.0, Broadcast=255.255.255.255, Interface UP, Broadcasts supported, Network interface
 
我说的是我上面贴的那个,呵呵。
都可以的,目前的Windows操作系统,最后得到的这个是Windows ME下面的。
OK!俺要工作了,Bye!
 
嗯,我又试了一下你贴的代码。
mask值是对的,那broadcast怎么都是255.255.255.255?
 
在联上互联网同时也在局域网内时怎么区分呢?
 
接受答案了.
 
后退
顶部