怎么取得本机的网络掩码?(50分)

  • 主题发起人 主题发起人 wingsn
  • 开始时间 开始时间
W

wingsn

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,因为要计算广播地址,所以需要取网络掩码,可是不知道用
哪个函数,知道的大侠指点一下?
 
我是先取得ip再计算广播地址;
 
我知道怎么取得IP,但是不知道网络掩码怎么能计算广播地址呢?
 
读取注册表中的
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/{F16D83E0-5E38-48D3-B207-8396C7E0E5D0}/Parameters/Tcpip
下的数据。可以先看一下。
 
这个我也知道,但是这是win2k下的吧,98下就不一样了。。。
 
用WinSock函数。
 
我当然知道要用winsock函数,但是用哪一个啊,怎么用?
谁能贴个例子,再加100分
 
NT(2000)下的我已经解决了。98真是烦死了,搞不定!
 
在98下,东西在
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Class/NetTrans/0000
的IPMask里面
 
用winsock函数,以下的代码是我从别的地方搞来的,你可以看看是不是适合你用

unit USock;

interface

uses Windows, Winsock;

{
此函数列举出所有的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 DOWN,';

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.
 
哈~上面的这段代码不行,起码在我的计算机上是这样。
看看我的贴子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1121329
说不定会有满意答案的。
 
那我的了?
 
To 远帆
为什么不行,有什么反应?能说明一下你的运行环境吗?
 
这段程序得到的广播地址总是255.255.255.255这肯定是错误的。
再说了,如果一边上internet,同时又在局域网上,无法分辨哪个是哪儿啊。
 
后退
顶部