C语言如何实现IP地址查询系统

C语言如何实现IP地址查询系统,第1张

C语言如何实现IP地址查询系统
参考如下:

void GetNameAndIp()
{
struct hostent host;
struct in_addr ptr;
DWORD dwScope = RESOURCE_CONTEXT;
NETRESOURCE NetResource = NULL;
HANDLE hEnum;
WNetOpenEnum(dwScope, NULL, NULL, NULL, &hEnum);
WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);
if (hEnum)
{
DWORD Count = 0xFFFFFFFF;
DWORD BufferSize = 10240;
LPVOID Buffer = new char[10240];
WNetEnumResource(hEnum, &Count, Buffer, &BufferSize);
NetResource = (NETRESOURCE)Buffer;
char szHostName[200];
for (unsigned int i = 0; i < BufferSize / sizeof(NETRESOURCE); i++, NetResource++)
{
if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY)
{
if (NetResource->lpRemoteName)
{
CString strFullName = NetResource->lpRemoteName;
if (0 == strFullNameLeft(2)Compare(_T("\\\\")))
strFullName = strFullNameRight(strFullNameGetLength() - 2);
gethostname(szHostName, strlen(szHostName));
USES_CONVERSION;
char pchar = T2A(strFullName);
host = gethostbyname(pchar);
if (host == NULL) continue;
ptr = (struct in_addr ) host->h_addr_list[0];
string str = "";
for (int n = 0; n<4; n++)
{
CString addr;
if (n > 0)
{
str += "";
}
int value = (unsigned int)((unsigned char)host->h_addr_list[0])[n];
char p[20];
sprintf(p, "%d", value);
strappend(p);
}
std::cout <<"IP:"<< str <<" Name:"<<host->h_name<< std::endl;
}
}
}
delete Buffer;
WNetCloseEnum(hEnum);
}
WSACleanup();
}

我临时写吧,没有调试,主要是这什么用啊,能用来换钱么
#inlcude<stdioh>
void main(void)
{
char a1,a2,a3,a4;
char m1,m2,m3,m4;
char r1,r2,r3,r4;
a1=127;a2=0;a3=0;a4=1; // your IP
m1=255;m2=255;m3=248;m4=0; // IP netmask
r1=a1&m1;r2=a2&m2;r3=a3&m3;r4=a4&m4; //your IP segment
m1=~m1;m2=~m2;m3=~m3;m4=~m4;
下面就是循环了循环的处理方法是如果m中为0,则循环0到255,不为0,则循环到大于这个m的时候,就终止所有循环,您自己动动脑筋,我点到这步比较好。

}

#include<WinSock2h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
    CInitSock(BYTE minorVer=2,BYTE majorVer=2)
    {
        WSADATA wsaData;
        WORD sockVersion=MAKEWORD(minorVer,majorVer);
        if(WSAStartup(sockVersion,&wsaData)!=0)
        {
            exit(0);
        }
    }
    ~CInitSock()
    {
        WSACleanup();
    }
};
WSADATA 这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据。它包含Winsockdll 执行的数据。
WSAStartup    为了在应用程序当 中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用 Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明 副版本、低位字节指明主版本; *** 作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时, *** 作系统根据请求的Socket版本来搜索相应的 Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
WSACleanup   应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调 用当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源任何打开的并已建立连接的SOCK_STREAM类型套接口在调用 WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送 对应于一个任务进行的每一次WSAStartup()调用,必须有一个 WSACleanup()调用只有最后的WSACleanup()做实际的清除工作;前面的调用仅仅将Windows Sockets DLL中的内置引用计数递减一个简单的应用程序为确保WSACleanup()调用了足够的次数,可以在一个循环中不断调用WSACleanup()直 至返回WSANOTINITIALISED
#include"initsockh"
#include<iostream>
using std::cout;
using std::endl;
CInitSock initSock;
void IP()
{
    int i;
    char szHost[256];
    gethostname(szHost,256);
    hostent pHost=gethostbyname(szHost);
    in_addr addr;
   
    char p=pHost->h_addr_list[0];
    memcpy(&addrS_unS_addr,p,pHost->h_length);
    char szIp=inet_ntoa(addr);
    cout<<szIp<<endl;
}
int main()
{
    IP();
    system("pause");
    return 0;
}
gethostname()   返回本地主机的标准主机名。
int PASCAL FAR gethostname(char FAR name, int namelen); 
name: 一个指向将要存放主机名的缓冲区指针。 
namelen:缓冲区的长度。
hostent      是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
#define h_addr h_addr_list[0]    h_addr_list中的第一地址。
struct hostent { 
     char h_name;       //地址的正式名称 
     char h_aliases; //空字节-地址的预备名称的指针。
     int h_addrtype; //地址类型; 通常是AF_INET。
     int h_length;     //地址的比特长度。
     char h_addr_list;     //零字节-主机网络地址指针。网络字节顺序。
};
memcpy
extern void memcpy(void destin, void source, unsigned n);
由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

我觉得你这个需求,倒不一定非得用c语言来实现。你这个其实可以调用百度的插件,因为你在百度上输入这个IP地址的话,然后他就能查出来这个IP所在的位置,你可以用JAVA,然后调用百度的一些插件就能实现这个功能。

这里有个隐含假设,即,整数也是用四字节表示的。这样的假设下,四字节IP地址和整数在内存中无差别。
比如:
#include <stdioh>
typedef struct IPAddr_
{
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
}IPAddr_t;
typedef union u_
{
int x;
IPAddr_t y;
}u; // 整数与IP地址用共用体表示
void main()
{
u testu;
testux = 303199946; // 也可用“scanf("%d",&(testux)); ”输入整数
// 输出IP地址2021181818
printf("%d%d%d%d",testuya,testuyb,testuyc,testuyd);
return;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13081425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-30
下一篇 2023-05-30

发表评论

登录后才能评论

评论列表(0条)

保存