#include
#include

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char* argv[])
{
    int fd_arp;      /* socket fd for receive packets */
    char device[10]; /* ethernet device name */
    u_char *ptr;
    struct in_addr myip, mymask;
    struct ifreq ifr; /* ifr structure */
    struct sockaddr_in *sin_ptr;

    if(argc < 2)
        strcpy(device, "eth0");
    else
        strcpy(device, argv[1]);
    strcpy(ifr.ifr_name, device);

    if ((fd_arp = socket(AF_INET, SOCK_PACKET, htons(0x0806))) < 0) {
        perror( "arp socket error");
        return -1;
    }

    /* ifr.ifr_addr.sa_family = AF_INET; */

    /* get ip address of my interface */
    if(ioctl(fd_arp, SIOCGIFADDR, &ifr) < 0) {
        perror("ioctl SIOCGIFADDR error");
        myip.s_addr = 0;
    }
    else {
        sin_ptr = (struct sockaddr_in *)&ifr.ifr_addr;
        myip = sin_ptr->sin_addr;
    }

    /* get network mask of my interface */
    if (ioctl(fd_arp, SIOCGIFNETMASK, &ifr) < 0) {
        perror("ioctl SIOCGIFNETMASK error");
        mymask.s_addr = 0;
    }
    else {
        sin_ptr = (struct sockaddr_in *)&ifr.ifr_addr;
        mymask = sin_ptr->sin_addr;
    }

    /* get mac address of the interface */
    if (ioctl(fd_arp, SIOCGIFHWADDR, &ifr) < 0) {
        perror("ioctl SIOCGIFHWADDR error");
        ptr = NULL;
    }
    else {
        ptr = (u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
    }

    printf( "device: %s\n", device);
    printf( "request netmask %s\n", inet_ntoa(mymask));
    printf( "request IP %s\n", inet_ntoa(myip));
    if (ptr)
        printf( "request mac %02x:%02x:%02x:%02x:%02x:%02x\n",
            *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3),
            *(ptr + 4), *(ptr + 5) );
    else
        printf( "request mac ?:?:?:?:?:?\n");

    return 0;
}

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUFSIZE 2048
#define DEBUG

struct route_info{
        struct in_addr dstAddr;
        struct in_addr srcAddr;
        struct in_addr gateWay;
        char ifName[IF_NAMESIZE];
};

int readNlSock(int sockFd, char *bufPtr, int seqNum, int pId)
{
        struct nlmsghdr *nlHdr;
        int readLen = 0, msgLen = 0;

        do {    /* Recieve response from the kernel */
                if((readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0) {
                        perror("SOCK READ: ");
                        return -1;
                }
                nlHdr = (struct nlmsghdr *)bufPtr;

                /* Check if the header is valid */
                if((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR)) {
                        perror("Error in recieved packet");
                        return -1;
                }

                /* Check if the its the last message */
                if(nlHdr->nlmsg_type == NLMSG_DONE) {
                        break;
                }
                else {
                        /* Else move the pointer to buffer appropriately */
                        bufPtr += readLen;
                        msgLen += readLen;
                }

                /* Check if its a multi part message */
                if((nlHdr->nlmsg_flags & NLM_F_MULTI) == 0) {
                        /* return if its not */
                        break;
                }
        } while((nlHdr->nlmsg_seq != seqNum) || (nlHdr->nlmsg_pid != pId));

        return msgLen;
}
#ifdef DEBUG
/* For printing the routes. */
void printRoute(struct route_info *rtInfo)
{
        char tempBuf[512];

        /* Print Destination address */
        if(rtInfo->dstAddr.s_addr != 0)
                strcpy(tempBuf, inet_ntoa(rtInfo->dstAddr));
        else
                sprintf(tempBuf,"*.*.*.*\t");
        fprintf(stdout,"%s\t", tempBuf);

        /* Print Gateway address */
        if(rtInfo->gateWay.s_addr != 0)
                strcpy(tempBuf, inet_ntoa(rtInfo->gateWay));
        else
                sprintf(tempBuf,"*.*.*.*\t");
        fprintf(stdout,"%s\t", tempBuf);

        /* Print Interface Name*/
        fprintf(stdout,"%s\t\t", rtInfo->ifName);

        /* Print Source address */
        if(rtInfo->srcAddr.s_addr != 0)
                strcpy(tempBuf, inet_ntoa(rtInfo->srcAddr));
        else
                sprintf(tempBuf,"*.*.*.*\t");
        fprintf(stdout,"%s\n", tempBuf);
}
#endif
/* For parsing the route info returned */
void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo,char *gateway)
{
        struct rtmsg *rtMsg;
        struct rtattr *rtAttr;
        int rtLen;
        char *tempBuf = NULL;

        tempBuf = (char *)malloc(100);
        rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);

        /* If the route is not for AF_INET or does not belong to main routing table then return. */
        if((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
                return;

        /* get the rtattr field */
        rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
        rtLen = RTM_PAYLOAD(nlHdr);
        for(;RTA_OK(rtAttr,rtLen);rtAttr = RTA_NEXT(rtAttr,rtLen)) {
                switch(rtAttr->rta_type) {
                        case RTA_OIF:
                                if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
                                break;
                        case RTA_GATEWAY:
                                rtInfo->gateWay.s_addr = *(u_int *)RTA_DATA(rtAttr);
                                break;
                        case RTA_PREFSRC:
                                rtInfo->srcAddr.s_addr = *(u_int *)RTA_DATA(rtAttr);
                                break;
                        case RTA_DST:
                                rtInfo->dstAddr.s_addr = *(u_int *)RTA_DATA(rtAttr);
                                break;
                }
        }
        #ifdef DEBUG
        printRoute(rtInfo);
        #endif

        //printf("%s\n", inet_ntoa(rtInfo->dstAddr));
        if(strstr(inet_ntoa(rtInfo->dstAddr), "0.0.0.0"))
                sprintf(gateway, "%s", inet_ntoa(rtInfo->gateWay));
        free(tempBuf);
        return;
}
int get_gateway(char *gateway)
{
        struct nlmsghdr *nlMsg;
        struct rtmsg *rtMsg;
        struct route_info *rtInfo;
        char msgBuf[BUFSIZE];
        int sock, len, msgSeq = 0;

        /* Create Socket */
        if((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) {
                perror("Socket Creation: ");
                return -1;
        }

        /* Initialize the buffer */
        memset(msgBuf, 0, BUFSIZE);

        /* point the header and the msg structure pointers into the buffer */
        nlMsg = (struct nlmsghdr *)msgBuf;
        rtMsg = (struct rtmsg *)NLMSG_DATA(nlMsg);

        /* Fill in the nlmsg header*/
        nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); // Length of message.
        nlMsg->nlmsg_type = RTM_GETROUTE; // Get the routes from kernel routing table .

        nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST; // The message is a request for dump.
        nlMsg->nlmsg_seq = msgSeq++; // Sequence of the message packet.
        nlMsg->nlmsg_pid = getpid(); // PID of process sending the request.

        /* Send the request */
        if(send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0) {
                printf("Write To Socket Failed...\n");
                return -1;
        }

        /* Read the response */
        if((len = readNlSock(sock, msgBuf, msgSeq, getpid())) < 0) {
                printf("Read From Socket Failed...\n");
                return -1;
        }

        /* Parse and print the response */
        rtInfo = (struct route_info *)malloc(sizeof(struct route_info));
        // ADDED BY BOB
        /* THIS IS THE NETTSTAT -RL code I commented out the printing here and in parse routes */
        #ifdef DEBUG
        fprintf(stdout, "Destination\tGateway\t\tInterface\tSource\n");
        #endif
        for(; NLMSG_OK(nlMsg,len); nlMsg=NLMSG_NEXT(nlMsg,len)) {
                memset(rtInfo, 0, sizeof(struct route_info));
                parseRoutes(nlMsg, rtInfo, gateway);
        }
        free(rtInfo);
        close(sock);

        return 0;
}
int main()
{
        char gateway[255]={0};

        get_gateway(gateway);
        printf("Gateway:%s\n", gateway);

        return 0;
}


台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

親手打造 GNU/Linux 中文環境 (五) - 訊息國際化的解決方案 (gettext 簡介)

謝東翰 ,小虫

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

下面列出了一些容易引發衝碼的文字,寫程式的人,最好都能夠測試下面的字在你的程式中可以正確無誤的被使用。

ASCII(5C) == "\"

A45C么 AE5C娉 B85C稞 C25C擺 A55C功
AF5C珮 B95C鈾 C35C黠 A65C吒 B05C豹
BA5C暝 C45C孀 A75C吭 B15C崤 BB5C蓋
C55C髏 A85C沔 B25C淚 BC5C墦 C65C躡
A95C坼 B35C許 BD5C穀 AA5C歿 B45C廄
BE5C閱 AB5C俞 B55C琵 BF5C璞 AC5C枯
B65C跚 C05C餐 AD5C苒 B75C愧 C15C縷

ASCII(7C) == "|"

AA7C泜 B47C揉 A87C育 BE7C魯 B27C琍
BC7C慝 C67C鸛 A97C尚 B37C逖 BD7C罵
A77C坑 B17C悴 BB7C誡 C57C疊 A67C帆
B07C院 BA7C漏 C47C辮 AB7C咽 B57C稅
BF7C糕 AC7C洱 B67C閏 C07C嚐 AD7C迢
B77C會 C17C舉 A47C弋 AE7C徑 B87C腮
C27C甕 A57C四 AF7C砝 B97C頌 C37C牘

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()

找更多相關文章與討論