⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockip.c

📁 基于嵌入式linux下
💻 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 + -