📄 sockip.c
字号:
#include "dispatch.h"
/* http://www.smth.edu.cn/bbsgcon.php?board=Programming&file=D/G.1031662772.Y0&num=619 */
#define inaddrr( x ) ( *( struct in_addr * )&ifr->x[ sizeof( sa.sin_port ) ] )
#define IFRSIZE ( ( int )( size * sizeof( struct ifreq ) ) )
int PPP_Status( void )
{
unsigned char * u;
int sockfd, size = 1,intPPPStatus;
struct ifreq * ifr;
struct ifconf ifc;
struct sockaddr_in sa;
char IP[16];
intPPPStatus=0;
if ( 0 > ( sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP ) ) )
{
fprintf( stderr, "Cannot open socket.\r\n" );
}
ifc.ifc_req = NULL;
do
{
++size;
/* realloc buffer size until no overflow occurs */
if ( NULL == ( ifc.ifc_req = realloc( ifc.ifc_req, IFRSIZE ) ) )
{
fprintf( stderr, "Out of memory.\r\n" );
return intPPPStatus;
}
ifc.ifc_len = IFRSIZE;
if ( ioctl( sockfd, SIOCGIFCONF, &ifc ) )
{
perror( "ioctl SIOCFIFCONF \r\n" );
return intPPPStatus;
}
} while ( IFRSIZE <= ifc.ifc_len );
ifr = ifc.ifc_req;
for ( ; ( char * )ifr < ( char * )ifc.ifc_req + ifc.ifc_len; ++ifr )
{
if ( ifr->ifr_addr.sa_data == ( ifr + 1 )->ifr_addr.sa_data )
{
continue; /* duplicate, skip it */
}
if ( ioctl( sockfd, SIOCGIFFLAGS, ifr ) )
{
continue; /* failed to get flags, skip it */
}
if ((strcmp(ifr->ifr_name,"eth0")==0) || (strcmp(ifr->ifr_name,"lo")==0) || (strcmp(ifr->ifr_name,"ath0")==0))
{
// MB_DEB( "Interface: %s", ifr->ifr_name );
memcpy(IP,inet_ntoa(((struct sockaddr_in*)(&ifr->ifr_addr))->sin_addr),15);
if ((strcmp(ifr->ifr_name,"ath0")==0))
{
memset(Dispatch_DataIP,0,sizeof(Dispatch_DataIP));
memcpy(Dispatch_DataIP,IP,15);
}
}
else
{
if (strcmp(ifr->ifr_name,"ppp0")==0)
{
memset(IP,0,sizeof(IP));
MB_DEB( "Interface: %s", ifr->ifr_name );
memcpy(IP,inet_ntoa(((struct sockaddr_in*)(&ifr->ifr_addr))->sin_addr),15);
IP[15]='\0';
intPPPStatus=1;
}
}
/*if ( 0 == ioctl( sockfd, SIOCGIFHWADDR, ifr ) )
{
switch ( ifr->ifr_hwaddr.sa_family )
{
case ARPHRD_NETROM:
printf( "row0\n" );
break;
case ARPHRD_ETHER:
printf( "row1\n" );
break;
case ARPHRD_PPP:
printf( "row2\n" );
break;
case ARPHRD_EETHER:
printf( "row3\n" );
break;
case ARPHRD_IEEE802:
break;
default:
printf( "row4\n" );
continue;
}
u = ( unsigned char * )&ifr->ifr_addr.sa_data;
if ( u[0] + u[1] + u[2] + u[3] + u[4] + u[5] )
{
printf( "HW Address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
u[0], u[1], u[2], u[3], u[4], u[5] );
}
}
printf( "\n" );*/
} /* end of for */
close( sockfd );
return intPPPStatus;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -