c语言查看网络端口,Linux/Unix下查看本机所有网络接口的C程序

#include"net_if.h"ifi_info*get_ifi_info(intfamily,intdoaliases){ifi_info*ifi,*ifihead,**ifipnext;intsockfd,len,lastlen,flags,myflags;char*ptr,*buf,lastname[IFNAMSIZ],*cptr;structifconf ifc;structifreq*ifr,ifrcopy;structsockaddr_in*sinptr;if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0){printf("socket error.\n");exit(1);}lastlen=0;len=10*sizeof(structifreq);while(1){buf=(char*)malloc(len);ifc.ifc_len=len;ifc.ifc_buf=buf;if(ioctl(sockfd,SIOCGIFCONF,&ifc)<0){if(errno!=EINVAL||lastlen!=0){printf("ioctl

error.\n");}}else{if(ifc.ifc_len==lastlen)break;lastlen=ifc.ifc_len;}len+=10*sizeof(structifreq);free(buf);}ifihead=NULL;ifipnext=&ifihead;lastname[0]=0;for(ptr=buf;ptr

len=sizeof(structsockaddr)>ifr->ifr_addr.sa_len?sizeof(structsockaddr):ifr->ifr_addr.sa_len;#elseswitch(ifr->ifr_addr.sa_family){#ifdefIPV6case:AF_INET6:LEN=sizeof(structsockaddr_in6);break;#endifcaseAF_INET:default:len=sizeof(structsockaddr);break;}#endifptr+=sizeof(ifr->ifr_name)+len;if(ifr->ifr_addr.sa_family!=family)continue;myflags=0;if((cptr=strchr(ifr->ifr_name,':'))!=NULL)*cptr=0;if(strncmp(lastname,ifr->ifr_name,IFNAMSIZ)==0){if(doaliases==0)continue;myflags=IFI_ALIAS;}memcpy(lastname,ifr->ifr_name,IFNAMSIZ);ifrcopy=*ifr;ioctl(sockfd,SIOCGIFFLAGS,&ifrcopy);flags=ifrcopy.ifr_flags;if((flags&IFF_UP)==0)continue;/*

if ((flags&IFF_BROADCAST)==0)

continue;

*/ifi=calloc(1,sizeof(structifi_info));*ifipnext=ifi;ifipnext=&ifi->ifi_next;ifi->ifi_flags=flags;ifi->ifi_myflags=myflags;memcpy(ifi->ifi_name,ifr->ifr_name,IFI_NAME);ifi->ifi_name[IFI_NAME-1]='\0';switch(ifr->ifr_addr.sa_family){caseAF_INET:sinptr=(structsockaddr_in*)&ifr->ifr_addr;if(ifi->ifi_addr==NULL){ifi->ifi_addr=calloc(1,sizeof(structsockaddr_in));memcpy(ifi->ifi_addr,sinptr,sizeof(structsockaddr_in));#ifdefSIOCGIFBRDADDRif(flags&IFF_BROADCAST){ioctl(sockfd,SIOCGIFBRDADDR,&ifrcopy);sinptr=(structsockaddr_in*)&ifrcopy.ifr_broadaddr;ifi->ifi_brdaddr=calloc(1,sizeof(structsockaddr_in));memcpy(ifi->ifi_brdaddr,sinptr,sizeof(structsockaddr_in));}#endif#ifdefSIOCGIFDSTADDRif(flags&IFF_POINTOPOINT){ioctl(sockfd,SIOCGIFDSTADDR,&ifrcopy);sinptr=(structsockaddr_in*)&ifrcopy.ifr_dstaddr;ifi->ifi_dstaddr=calloc(1,sizeof(structsockaddr_in));memcpy(ifi->ifi_dstaddr,sinptr,sizeof(structsockaddr_in));}#endif}break;default:break;}}free(buf);return(ifihead);}voidfree_ifi_info(ifi_info*ifihead){ifi_info*ifi,*ifinext;for(ifi=ifihead;ifi!=NULL;ifi=ifinext){if(ifi->ifi_addr!=NULL)free(ifi->ifi_addr);if(ifi->ifi_brdaddr!=NULL)free(ifi->ifi_brdaddr);if(ifi->ifi_dstaddr!=NULL)free(ifi->ifi_dstaddr);ifinext=ifi->ifi_next;free(ifi);}}char*sock_ntop(conststructsockaddr*sa,socklen_tsalen){charportstr[7];staticcharstr[128];switch(sa->sa_family){caseAF_INET:{structsockaddr_in*sin=(structsockaddr_in*)sa;if(inet_ntop(AF_INET,&sin->sin_addr,str,sizeof(str))==NULL)returnNULL;if(ntohs(sin->sin_port)!=0){snprintf(portstr,sizeof(portstr),".%d",ntohs(sin->sin_port));strcat(str,portstr);}returnstr;}break;caseAF_INET6:{structsockaddr_in6*sin=(structsockaddr_in6*)sa;if(inet_ntop(AF_INET6,&sin->sin6_addr,str,sizeof(str))==NULL)returnNULL;if(ntohs(sin->sin6_port)!=0){snprintf(portstr,sizeof(portstr),".%d",ntohs(sin->sin6_port));strcat(str,portstr);}returnstr;}break;default:returnNULL;break;}}intmain(intargc,char*argv[]){ifi_info*ifi,*ifihead;structsockaddr*sa;u_char*ptr;inti,family,doaliases;if(argc!=3){printf("usage: prifinfo ");exit(1);}if(strcmp(argv[1],"inet4")==0)family=AF_INET;#ifdefIPV6elseif(strcmp(argv[1],"inet6")==0)family=AF_INET6;#endifelse{printf("invalid ");exit(1);}doaliases=atoi(argv[2]);for(ifihead=ifi=get_ifi_info(family,doaliases);ifi!=NULL;ifi=ifi->ifi_next){printf("%s:,ifi->ifi_name);if(ifi->ifi_flags&IFF_UP)printf("UP");if(ifi->ifi_flags&IFF_BROADCAST)printf("BCAST");if(ifi->ifi_flags&IFF_MULTICAST)printf("MCAST");if(ifi->ifi_flags&IFF_LOOPBACK)printf("LOOP");if(ifi->ifi_flags&IFF_POINTOPOINT)printf("P2P");printf(">\n");if((i=ifi->ifi_hlen)>0){ptr=ifi->ifi_haddr;do{printf("%s%x",(i==ifi->ifi_hlen)?" ":":",*ptr++);}while(--i>0);printf("\n");}if((sa=ifi->ifi_addr)!=NULL)printf(" IP addr: %s\n",sock_ntop(sa,sizeof(*sa)));if((sa=ifi->ifi_brdaddr)!=NULL)printf(" broadcast addr: %s\n",sock_ntop(sa,sizeof(*sa)));if((sa=ifi->ifi_dstaddr)!=NULL)printf(" destnation addr: %s\n",sock_ntop(sa,sizeof(*sa)));}free_ifi_info(ifihead);exit(0);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值