吐血求用程序获得子网掩码的方法!!!给与帮助者必定中谢。

shuihe 2003-12-26 10:55:10
本人由于工作关系,要写获得子网掩码的程序!有那位大哥知道吗?提供有用帮助者必重谢。
...全文
99 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh149129 2003-12-26
  • 打赏
  • 举报
回复
给你一个从网络找的程序:

获取IP地址以及全部TCPIP连接的掩码
我们有很多种方法获取一台计算机的IP地址,但这里才是“正确”的方法:列出所有的地址、网络掩码、广播地址和连接状态等,包括环回点 127.0.0.1。需要使用到WinSock2。
这是一个完整的Delphi单元,将它加入到你的工程中,你可以调用:

EnumInterfaces(var s string): Boolean;


来返回所有IP地址、网络掩码、广播地址和连接状态。

--------------------------------------------------------------------
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[i].iiAddress.addressIn; // IP ADDRESS

pAddrString := inet_ntoa(pAddrInet.sin_addr);

sInt := sInt + ' IP=' + pAddrString + ',';

pAddrInet := Buffer[i].iiNetMask.addressIn; // SUBNET MASK

pAddrString := inet_ntoa(pAddrInet.sin_addr);

sInt := sInt + ' Mask=' + pAddrString + ',';

pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr

pAddrString := inet_ntoa(pAddrInet.sin_addr);

sInt := sInt + ' Broadcast=' + pAddrString + ',';



SetFlags := Buffer[i].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.
mxk19791116 2003-12-26
  • 打赏
  • 举报
回复
up
coffeesun 2003-12-26
  • 打赏
  • 举报
回复
当前机器的设置可以从注册表
HKEY_LOCAL_MACHINE\System\CurrentControlSet\
Services\Class\NetTrans\中得到。
搜索从0001到000a,如果
DriverDesc =TCP/IP,则IPMask就是当前掩码
在delphi中读取键值
shuihe 2003-12-26
  • 打赏
  • 举报
回复
谢谢
up
【传感器】【鲁棒目标定位】基于平方距离迭代重新加权最小二乘法的鲁棒目标定位(Matlab代码实现)内容概要:本文介绍了基于平方距离迭代重新加权最小二乘法的鲁棒目标定位方法,结合传感器数据处理技术,旨在提升定位系统的抗干扰能力与精度,适用于存在异常值或噪声干扰的复杂环境。文中通过Matlab代码实现该算法,展示了其在目标定位中的有效性与鲁棒性,并探讨了相关参数设置对定位性能的影响,为传感器网络中的定位问题提供了可行的技术方案。; 适合人群:具备一定信号处理、优化算法基础,从事传感器网络、目标定位、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于无线传感器网络(WSN)、雷达、无人机等系统的高精度目标定位;②解决含有异常测距数据或非视距(NLOS)误差的实际定位问题;③通过迭代重加权策略提升传统最小二乘法的鲁棒性,实现更稳定的定位效果。; 阅读建议:建议结合Matlab代码实践操作,深入理解平方距离变换与迭代重加权机制的设计逻辑,重点关注权重函数的选择与收敛判据设定,同时可将其与其他定位算法(如WLS、M估计)进行对比分析以加深理解。

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧