网络编程相关函数说明

网络编程相关函数说明

一、获取计算机的IP地址和名称

利用函数GetComputerName()

TheGetComputerNamefunction retrieves the NetBIOS name of the local computer. This name is established at system startup, when the system reads it from the registry.

BOOL GetComputerName( LPTSTRlpBuffer, LPDWORDlpnSize);

//获取计算机名称

TCHARch[20];

memset(ch,0,20*sizeof(TCHAR));

DWORDdw= 20;

GetComputerName(ch,&dw);

AfxMessageBox((CString)ch);

利用WinSock库也可以获取计算机的名称,但是首先必须得初始化WinSock库。

1.gethostname函数:

This function returns the standard host name for the local machine.

int gethostname(char FAR*name, intnamelen);

没有错误则返回0,有错误则返回SOCKET_ERROR,通过WSAGetLastError获取指定的错误代码

charname[20];

memset(name,0,sizeof(char)*20);

gethostname(name,20);

2.gethostbyname函数:从主机数据库中得到对应的主机的相应信息,如IP地址等。

This function retrieves host information corresponding to a host name from a host database.

struct hostent FAR* gethostbyname(const char FAR*name);//name是主机名字,一般是由gethostname获得的名字。

struct hostent {

char FAR*h_name;//正规的主机名字

char FAR* FAR*h_aliases;//一个以空指针结尾的可选主机名队列

shorth_addrtype;//返回地址类型

shorth_length;//每个地址的长度

char FAR* FAR*h_addr_list;};//空指针结尾的主机地址列表

//获取IP地址

//char name[] =www.sina.com.cn;

structhostent*p_HostEnt;

p_HostEnt=gethostbyname(name);

if(p_HostEnt!=NULL)

{

WCHARHostAddress[20];

wsprintf(HostAddress,_T("%d.%d.%d.%d"),(p_HostEnt->h_addr_list[0][0] & 0x00ff),

(p_HostEnt->h_addr_list[0][1] & 0x00ff),(p_HostEnt->h_addr_list[0][2] & 0x00ff),(p_HostEnt->h_addr_list[0][3] & 0x00ff));

AfxMessageBox((CString)HostAddress);

}

3.gethostbyaddr函数:从网络地址得到对应的主机。

This function retrieves the host information corresponding to a network address.

struct hostent FAR* gethostbyaddr(const char FAR*addr,intlen,inttype);

addr为地址,len为地址的长度,type为地址类型,AF_INET

//根据地址来获取主机名字

charsin[] ="100.0.0.150";

DWORDdw=inet_addr(sin);//网络字节序

intlen=strlen(sin);

hostent*pHostEnt;

pHostEnt=gethostbyaddr((LPSTR)(&dw),len,AF_INET);

二、获取计算机子网掩码

用函数GetAdaptersInfo可以获取本地计算机的网络信息,从而获得该计算机的子网掩码。

DWORD GetAdaptersInfo(PIP_ADAPTER_INFOpAdapterInfo,PULONGpOutBufLen);

MSDN: This function retrieves adapter information for the local computer.

pAdapterInfo为指向IP_ADAPTER_INFO,此结构体包含了本地计算机上的一个特定网络适配卡的信息:

typedef struct _IP_ADAPTER_INFO {

struct _IP_ADAPTER_INFO*Next;

DWORDComboIndex;

CharAdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//网卡名

charDescription[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//对网卡的描述

UINTAddressLength;//物理地址的长度

BYTEAddress[MAX_ADAPTER_ADDRESS_LENGTH];//物理地址

DWORDIndex;//网卡索引号

UINTType;//网卡类型

UINTDhcpEnabled;//是否启用了DHCP动态IP分配

PIP_ADDR_STRINGCurrentIpAddress;//当前使用的IP

IP_ADDR_STRINGIpAddressList;//绑定到此网卡的IP地址链表

IP_ADDR_STRINGGatewayList;//网关地址链表

IP_ADDR_STRINGDhcpServer;//DHCP服务器地址

BOOLHaveWins;//是否启用了WINS

IP_ADDR_STRINGPrimaryWinsServer;//WINS地址

IP_ADDR_STRINGSecondaryWinsServer;//WINS地址

time_tLeaseObtained;//当前DHCP租借获取的时间

time_tLeaseExpires;//失效时间

} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

需要包含头文件Iphlpapi.h,需要包含库文件Iphlpapi.lib

//获取网卡的相关信息,还可以枚举网卡

IP_ADAPTER_INFO*pAdapterInfo;

pAdapterInfo= (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO) );

ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);

//第一次调用GetAdaptersInfo获取适当的ulOutBufLen变量大小

DWORDres=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);

free(pAdapterInfo);

pAdapterInfo= (IP_ADAPTER_INFO*)malloc(ulOutBufLen);

res=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);

三、获取计算机的DNS设置

采用函数GetNetWorkParams函数可以获得本地计算机的网络参数,从而获得计算机的DNS设置。

DWORD GetNetworkParams(PFIXED_INFO pFixedInfo,PULONG pOutBufLen);

MSDN:This function retrieves network parameters for the local computer.

参数pFixedInfo定义为:

typedef struct {

charHostName[MAX_HOSTNAME_LEN + 4];//主机名字

charDomainName[MAX_DOMAIN_NAME_LEN + 4]; //域名

PIP_ADDR_STRINGCurrentDnsServer; //IP地址的一个节点

IP_ADDR_STRINGDnsServerList; //服务器IP地址链表

UINTNodeType; //节点类型

charScopeId[MAX_SCOPE_ID_LEN + 4]; //

UINTEnableRouting; //

UINTEnableProxy; //

UINTEnableDns; //

} FIXED_INFO, *PFIXED_INFO;

//获取DNS设置

FIXED_INFO*pFixedInfo;

ULONGulOutBufLen;

DWORDdwRetVal;

pFixedInfo= (FIXED_INFO*)malloc(sizeof(FIXED_INFO) );

ulOutBufLen=sizeof(FIXED_INFO);

if(GetNetworkParams(pFixedInfo, &ulOutBufLen) ==ERROR_BUFFER_OVERFLOW)

{

free(pFixedInfo);

pFixedInfo= (FIXED_INFO*)malloc(ulOutBufLen);

}

dwRetVal=GetNetworkParams(pFixedInfo, &ulOutBufLen);

四、获取计算机安装的协议

可以通过函数WSAEnumProtocols获取安装在本地主机上可用的网络协议集。

int WSAEnumProtocols(LPINTlpiProtocols,LPWSAPROTOCOL_INFOlpProtocolBuffer,ILPDWORDlpdwBufferLength);

MSDNThis function retrieves information about available transport protocols.

lpProtocolBuffer是结构WSAPROTOCOL填充的缓冲区,定义为:

typedef struct _WSAPROTOCOL_INFO {

DWORDdwServiceFlags1;

DWORDdwServiceFlags2;

DWORDdwServiceFlags3;

DWORDdwServiceFlags4;

DWORDdwProviderFlags;

GUIDProviderId;

DWORDdwCatalogEntryId;

WSAPROTOCOLCHAINProtocolChain;

intiVersion;

intiAddressFamily;

intiMaxSockAddr;

intiMinSockAddr;

intiSocketType;

intiProtocol;

intiProtocolMaxOffset;

intiNetworkByteOrder;

intiSecurityScheme;

DWORDdwMessageSize;

DWORDdwProviderReserved;

TCHARszProtocol[WSAPROTOCOL_LEN+1];

} WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO;

同时也可以调用函数getprotobyname获取对应于给定协议名的相关协议信息:

struct PROTOENT* FAR getprotobyname(const char*name);

MSDN:Thegetprotobynamefunction retrieves the protocol information corresponding to a protocolname.

typedef struct protoent {
char FAR*p_name;//
正规协议名

char FARFAR**p_aliases;//
一个以空指针结尾的可选协议队列
shortp_proto;//
主机字节顺序的协议号

} protoent;

还有一个函数根据协议号来获取协议的相关信息:

struct PROTOENT* FAR getprotobynumber( intnumber);

五、获取计算机提供的服务

可以调用函数getservbyname来获取对应给定服务名和服务协议的相关服务信息。

struct servent* FAR getservbyname( onst char*name,const char*proto);

MSDN:Thegetservbynamefunction retrieves service information corresponding to a service name and protocol.

typedef struct servent {
char FAR*s_name;//
正规服务名

char FARFAR**s_aliases; //
一个以空指针结尾的可选协议队列
shorts_port;//
端口号
char FAR*s_proto;//
连接该服务时所用到的协议名

} servent;

也可以调用函数getservbyport来获取对于给定端口号和协议名的相关服务信息:

struct servent* FAR getservbyport( intport, const char*proto);

六、获取计算机的所有网络资源

函数WNetOpenEnum开始一个网络资源或存在的网络连接枚举值,可以通过调用函数WNetEnumResource获取详细的网络资源。

DWORD WNetOpenEnum(

DWORDdwScope,

DWORDdwType,

DWORDdwUsage,

LPNETRESOURCElpNetResource,

LPHANDLElphEnum

);

//上述具体各个参数见MSDNNETRESOURCE结构体定义如下:

typedef struct _NETRESOURCE {

DWORDdwScope;

DWORDdwType;

DWORDdwDisplayType;

DWORDdwUsage;

LPTSTRlpLocalName;

LPTSTRlpRemoteName;

LPTSTRlpComment;

LPTSTRlpProvider;

} NETRESOURCE;

WNetEnumResourceThis function continues a network-resource enumeration started by theWNetOpenEnumfunction.

DWORD WNetEnumResource(

HANDLEhEnum, //这个参数为WNetOpenEnum的最后一个参数

LPDWORDlpcCount,

LPVOIDlpBuffer,

LPDWORDlpBufferSize

);

七、修改本地网络设置

修改本地已经存在的地址解析协议表:SetIpNetEntry:

DWORD SetIpNetEntry( PMIB_IPNETROWpArpEntry);

l设置某一网络接口卡的管理状态,SetIfentry

DWORD SetIfEntry( PMIB_IFROWpIfRow);

l为本地计算机特定的适配器添加地址,AddIpAddress:

DWORD AddIPAddress(

IPAddrAddress,

IPMaskIpMask,

DWORDIfIndex,

PULONGNTEContext,

PULONGNTEInstance

);

l删除IP地址,DeleteIpAddress:

DWORD DeleteIPAddress( ULONGNTEContext);

八、获取计算机TCP/IP的所有信息

通过函数GetTcpStatics获取本地的TCP协议统计信息:

DWORD GetTcpStatistics( PMIB_TCPSTATSpStats);参数pStats是指向MIB_TCPSTATS的指针,定义如下:

typedef struct _MIB_TCPSTATS {

DWORDdwRtoAlgorithm;

DWORDdwRtoMin;

DWORDdwRtoMax;

DWORDdwMaxConn;

DWORDdwActiveOpens;

DWORDdwPassiveOpens;

DWORDdwAttemptFails;

DWORDdwEstabResets;

DWORDdwCurrEstab;

DWORDdwInSegs;

DWORDdwOutSegs;

DWORDdwRetransSegs;

DWORDdwInErrs;

DWORDdwOutRsts;

DWORDdwNumConns;

} MIB_TCPSTATS, *PMIB_TCPSTATS;

函数GetTcpTable获取TCP协议连接表:

DWORD GetTcpTable(PMIB_TCPTABLEpTcpTable, PDWORDpdwSize, BOOLbOrder);

函数GetIpAddrTable获取网络接口卡与IP地址的映射表:

DWORD GetIpAddrTable( PMIB_IPADDRTABLEpIpAddrTable,PULONGpdwSize,BOOLbOrder);

GetIpStatics获取当前IP统计信息:

DWORD GetIpStatistics( PMIB_IPSTATSpStats);

typedef struct _MIB_IPSTATS {

DWORD dwForwarding;

DWORD dwDefaultTTL;

DWORDdwInReceives;

DWORDdwInHdrErrors;

DWORDdwInAddrErrors;

DWORDdwForwDatagrams;

DWORDdwInUnknownProtos;

DWORDdwInDiscards;

DWORDdwInDelivers;

DWORDdwOutRequests;

DWORDdwRoutingDiscards;

DWORDdwOutDiscards;

DWORDdwOutNoRoutes;

DWORDdwReasmTimeout;

DWORDdwReasmReqds;

DWORDdwReasmOks;

DWORDdwReasmFails;

DWORDdwFragOks;

DWORDdwFragFails;

DWORDdwFragCreates;

DWORD dwNumIf;

DWORD dwNumAddr;

DWORD dwNumRoutes;

} MIB_IPSTATS, *PMIB_IPSTATS;

你可能感兴趣的:(网络编程)