Windows下socket编程怎么获取本机ip_使用socke技术编写一段代码,完成获取本地主机的ip地址、子网掩码、网络关地(1)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

struct hostent \*phostinfo = gethostbyname("");  
for(i = 0; NULL != phostinfo&& NULL != phostinfo->h_addr_list[i]; ++i)
{
	char \*pszAddr = inet\_ntoa(\*(struct in\_addr \*)phostinfo->h_addr_list[i]);
	printf("%s\n", pszAddr);
}

WSACleanup( );  

}

int main()
{
getIPs();
return 0;
}


### 方法二


使用IDE新建一个C语言程序进行编写。代码如下:



#include <stdio.h>
#include <winsock2.h>

void queryLocalIP() {
WSADATA data;
if(WSAStartup(MAKEWORD(1,1),&data)!=0){
printf(“初始化错误”);
}

char host[255]="";
if(gethostname(host,sizeof(host))==SOCKET_ERROR){
	printf("无法获取计算机主机名\n");
}
else{
	printf("本机名称为:%s\n",host);
}

struct hostent \*p=gethostbyname(host);
if(p==0){
	printf("无法获取计算机主机名及IP\n");
}
else{
	
	//本机IP:循环输出本机所有网卡的IP,其中包括虚拟网卡 
	int i;
	for(i=0;p->h_addr_list[i]!=0;i++){
		struct in\_addr in;
		memcpy(&in,p->h_addr_list[i],sizeof(struct in\_addr));
		printf("本机的第%d块网卡的IP为:%s\n",i+1,inet\_ntoa(in));
		//cout<<"第"<<i+1<<"块网卡的IP为:"<<inet\_ntoa(in)<<endl;
	}
}
WSACleanup();

}

void queryHostNameIP(char *host) {
WSADATA data;
if(WSAStartup(MAKEWORD(1,1),&data)!=0){
printf(“初始化错误”);
}

//char host[255];

struct hostent \*p=gethostbyname(host);
if(p==0){
	printf("无法获取%s的信息\n",host);
}
else{
	//本机IP:循环输出本机所有网卡的IP,其中包括虚拟网卡 
	int i;
	for(i=0;p->h_addr_list[i]!=0;i++){
		struct in\_addr in;
		memcpy(&in,p->h_addr_list[i],sizeof(struct in\_addr));
		printf("解析%s的第%d个IP为:%s\n",host,i+1,inet\_ntoa(in));
		//cout<<"第"<<i+1<<"块网卡的IP为:"<<inet\_ntoa(in)<<endl;
	}
}

WSACleanup();

}

int main(){
queryLocalIP();

printf("=================================\n");
char\*  hostname = "www.baidu.com";
queryHostNameIP(hostname); 
printf("=================================\n");
//输出个人信息
printf("Ranly 2022/4/23");
return 0;

}


### 方法三:来自chatGPT


#include <stdio.h>  
 #include <winsock2.h>  
 #include <ws2tcpip.h>


#pragma comment(lib, “ws2\_32.lib”)


int main() {  
 WSADATA wsaData;  
 int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
 if (iResult != 0) {  
 printf(“WSAStartup failed: %d\n”, iResult);  
 return 1;  
 }



char host_name[256];
gethostname(host_name, sizeof(host_name));

struct addrinfo *result = NULL, *ptr = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用Python编写获取本地主机信息的示例代码: ```python import socket import fcntl import struct # 获取本地主机名和IP地址 def get_host_ip(): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('8.8.8.8', 80)) ip = s.getsockname()[0] finally: s.close() return ip # 获取本地主机子网掩码 def get_netmask(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) netmask = socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x891b, # SIOCGIFNETMASK struct.pack('256s', bytes(ifname[:15], 'utf-8')) )[20:24]) return netmask # 获取本地主机的网关地址 def get_gateway(): with open('/proc/net/route') as f: for line in f: fields = line.strip().split() if fields[1] != '00000000' or not int(fields[3], 16) & 2: continue gateway = socket.inet_ntoa(struct.pack('<L', int(fields[2], 16))) return gateway # 获取本地主机的DNS服务器地址 def get_nameservers(): with open('/etc/resolv.conf') as f: nameservers = [] for line in f: fields = line.strip().split() if fields[0] != 'nameserver': continue nameservers.append(fields[1]) return nameservers if __name__ == '__main__': hostname = socket.gethostname() ip_address = get_host_ip() netmask = get_netmask('eth0') gateway = get_gateway() nameservers = get_nameservers() print('Hostname:', hostname) print('IP Address:', ip_address) print('Netmask:', netmask) print('Gateway:', gateway) print('Nameservers:', ', '.join(nameservers)) ``` 需要注意的是,本代码获取子网掩码和网关地址的方式是基于Linux系统的,如果您是在其他操作系统上运行此代码,可能需要根据不同的系统做出相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值