<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1974455674340917444</id><updated>2011-08-01T05:38:52.670-07:00</updated><category term='raw socket'/><category term='SOCKET programming'/><category term='packet sniffer'/><category term='IOCTL'/><category term='C language'/><category term='LINUX'/><category term='ARP REQUEST'/><title type='text'>spawning</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-3760881035879778076</id><published>2010-07-19T11:14:00.000-07:00</published><updated>2010-07-19T11:24:27.695-07:00</updated><title type='text'>udp send</title><content type='html'>#include&lt;stdio.h&gt;&lt;br /&gt;#include&lt;unistd.h&gt;&lt;br /&gt;#include&lt;sys/socket.h&gt;&lt;br /&gt;#include&lt;sys/types.h&gt;&lt;br /&gt;#include&lt;signal.h&gt;&lt;br /&gt;#include&lt;sys/select.h&gt;&lt;br /&gt;#include&lt;stdlib.h&gt;&lt;br /&gt;#include&lt;string.h&gt;&lt;br /&gt;#include&lt;linux/udp.h&gt;&lt;br /&gt;#include&lt;netinet/in.h&gt;&lt;br /&gt;#include&lt;arpa/inet.h&gt;&lt;br /&gt;&lt;br /&gt;int fd,num_pkt;&lt;br /&gt;void sig_handler(int num)&lt;br /&gt;{&lt;br /&gt;    printf("sent %d packets\n",num_pkt);&lt;br /&gt;    close(fd);&lt;br /&gt;    exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void print_pkt(unsigned *buf, int len)&lt;br /&gt;{&lt;br /&gt;    int j;&lt;br /&gt;   &lt;br /&gt;    for(j=0; j&lt; len; j++)&lt;br /&gt;    {&lt;br /&gt;        if(j%16 == 0 || j != 0)&lt;br /&gt;            printf("\n");&lt;br /&gt;        printf("%02x ",buf[j]);&lt;br /&gt;    }&lt;br /&gt;    printf("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;struct _udp_packet&lt;br /&gt;{&lt;br /&gt;    struct udphdr udp;&lt;br /&gt;    unsigned char data[22];&lt;br /&gt;}__attribute__((__packed__));&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;    struct sockaddr_in sin;&lt;br /&gt;    struct _udp_packet udpkt;&lt;br /&gt;&lt;br /&gt;    if(argc != 4)&lt;br /&gt;    {&lt;br /&gt;        printf("Usage:\n./udp &lt;dest&gt; &lt;src&gt; &lt;ip&gt;\n");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    fd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);&lt;br /&gt;    if(fd &lt; 0)&lt;br /&gt;    {&lt;br /&gt;        perror("socket");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    sin.sin_family = AF_INET;&lt;br /&gt;    //sin.sin_port   = htons(atoi(argv[1]);&lt;br /&gt;    sin.sin_addr.s_addr = inet_addr(argv[3]);&lt;br /&gt;&lt;br /&gt;    udpkt.udp.source = htons(atoi(argv[2]));&lt;br /&gt;    udpkt.udp.dest   = htons(atoi(argv[1]));&lt;br /&gt;    udpkt.udp.len    = htons(8 + sizeof(udpkt.data));&lt;br /&gt;    udpkt.udp.check  = 0x0000;&lt;br /&gt;&lt;br /&gt;    memset(udpkt.data, 0, sizeof(udpkt.data));&lt;br /&gt;&lt;br /&gt;    signal(SIGINT,sig_handler);&lt;br /&gt;    signal(SIGQUIT,sig_handler);&lt;br /&gt;    while(1)&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        if(sendto(fd, (unsigned char*)&amp;amp;udpkt, 30, 0, (struct sockaddr *)&amp;amp;sin, sizeof(struct sockaddr)) &lt; 0)&lt;br /&gt;        {&lt;br /&gt;            perror("sendto");&lt;br /&gt;            close(fd);&lt;br /&gt;            exit(1);&lt;br /&gt;        }&lt;br /&gt;   &lt;br /&gt;        num_pkt++;&lt;br /&gt;        sleep(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-3760881035879778076?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/3760881035879778076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2010/07/udp-send.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/3760881035879778076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/3760881035879778076'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2010/07/udp-send.html' title='udp send'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-2628496528503538291</id><published>2010-03-13T13:13:00.000-08:00</published><updated>2010-03-13T13:30:43.427-08:00</updated><title type='text'>Kid Ping Utility</title><content type='html'>/*****************************************************&lt;br /&gt; * Author      : Chaitanya bhargav M&lt;br /&gt; * Date        : 13 March 2010&lt;br /&gt; * License     : Free, but unreliable&lt;br /&gt; * Description : Simpler ping without any options,&lt;br /&gt;                 created just for fun!&lt;br /&gt; *****************************************************/ &lt;br /&gt;&lt;br /&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include&amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include&amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/types.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/time.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/param.h&amp;gt;&lt;br /&gt;#include&amp;lt;linux/if_ether.h&amp;gt;&lt;br /&gt;#include&amp;lt;linux/ip.h&amp;gt;&lt;br /&gt;#include&amp;lt;linux/icmp.h&amp;gt;&lt;br /&gt;#include&amp;lt;linux/if_packet.h&amp;gt;&lt;br /&gt;#include&amp;lt;net/if.h&amp;gt;&lt;br /&gt;#include&amp;lt;string.h&amp;gt;&lt;br /&gt;#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include&amp;lt;signal.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int sock_fd,transmitted = 0,received = 0;&lt;br /&gt;float t_sum = 0;&lt;br /&gt;&lt;br /&gt;void sig_handler(int sigNum)&lt;br /&gt;{&lt;br /&gt;    printf("\n=======================ping stats======================");&lt;br /&gt;    printf("\n%d packets transmitted, %d received, avg.delay = %.3fms\n",transmitted,received,(t_sum/received));&lt;br /&gt;    printf("Packet loss = %d%%,",((transmitted-received)/(transmitted))*100);&lt;br /&gt;    printf(" Thanks for using! -Chaitu\n");&lt;br /&gt;    close(sock_fd);&lt;br /&gt;    exit(127);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#pragma pack(1)&lt;br /&gt;struct _icmp_{&lt;br /&gt;    struct icmphdr icmp;&lt;br /&gt;    unsigned char data[22];&lt;br /&gt;}packet;&lt;br /&gt;&lt;br /&gt;unsigned short check_sum(unsigned char *buf, int len);&lt;br /&gt;char *ip_ntoa(unsigned int ipAddr)&lt;br /&gt;{&lt;br /&gt;    char *ip = (char *)malloc(16);&lt;br /&gt;    sprintf(ip,"%d.%d.%d.%d",(ipAddr&amp;0xff000000)&gt;&gt;24,&lt;br /&gt;                             (ipAddr&amp;0x00ff0000)&gt;&gt;16,&lt;br /&gt;                             (ipAddr&amp;0x0000ff00)&gt;&gt;8,&lt;br /&gt;                             (ipAddr&amp;0x000000ff));&lt;br /&gt;    return ip;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;struct timezone tz;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    int retVal,sin_size,data_len;    &lt;br /&gt;    unsigned short seq = 0x0000;&lt;br /&gt;    struct iphdr *ip;&lt;br /&gt;    struct icmphdr *icmp;&lt;br /&gt;    struct sockaddr_in whereto,sin ;&lt;br /&gt;    struct timeval *tp = (struct timeval *)&amp;packet.data[0];&lt;br /&gt;    struct timeval *tp1;&lt;br /&gt;    struct timeval  tv;&lt;br /&gt;    float delay;&lt;br /&gt;&lt;br /&gt;    if(argc != 2)&lt;br /&gt;    {&lt;br /&gt;        printf("Usage:\n ./pinger &lt;IP&gt;\n");&lt;br /&gt;        exit(127);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    whereto.sin_family = AF_INET;&lt;br /&gt;    whereto.sin_addr.s_addr = inet_addr(argv[1]);&lt;br /&gt;    memset(&amp;packet.data[0],0,22);&lt;br /&gt;    unsigned char buf[1518];&lt;br /&gt;&lt;br /&gt;    sock_fd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);&lt;br /&gt;    if(sock_fd &lt; 0)&lt;br /&gt;    {&lt;br /&gt;        perror("socket");&lt;br /&gt;        exit(127);&lt;br /&gt;    }    &lt;br /&gt;&lt;br /&gt;    signal(SIGINT,sig_handler);&lt;br /&gt;&lt;br /&gt;    while(1)&lt;br /&gt;    {&lt;br /&gt;         /* Send the packet */&lt;br /&gt;         gettimeofday(tp, &amp;tz);&lt;br /&gt;         packet.icmp.type = ICMP_ECHO; &lt;br /&gt;         packet.icmp.code = 0;&lt;br /&gt;         packet.icmp.checksum = 0;&lt;br /&gt;         packet.icmp.un.echo.id = htons(0xc000);&lt;br /&gt;         packet.icmp.un.echo.sequence = htons(++seq);&lt;br /&gt;         packet.icmp.checksum = htons(check_sum((unsigned char *)&amp;packet.icmp.type,30));&lt;br /&gt;         retVal = sendto(sock_fd, (unsigned char *)&amp;packet, 30, 0,(struct sockaddr *) &amp;whereto, sizeof(struct sockaddr));&lt;br /&gt;         if(retVal &lt; 0)&lt;br /&gt;         {&lt;br /&gt;             perror("send to");&lt;br /&gt;             close(sock_fd);&lt;br /&gt;             exit(127);&lt;br /&gt;         }&lt;br /&gt;         transmitted++;&lt;br /&gt;         &lt;br /&gt;         /* Receive Packet */&lt;br /&gt;         data_len = recvfrom(sock_fd, buf, 1518, 0 ,(struct sockaddr *)&amp;sin, &amp;sin_size);&lt;br /&gt;         ip = (struct iphdr *)buf;&lt;br /&gt;         icmp = (struct icmphdr *)(buf + ((ip-&gt;ihl) &lt;&lt; 2));&lt;br /&gt;         if(icmp-&gt;type == ICMP_ECHOREPLY)&lt;br /&gt;         {&lt;br /&gt;              if(icmp-&gt;un.echo.id == htons(0xc000)) &lt;br /&gt;              {&lt;br /&gt;                  if(icmp-&gt;un.echo.sequence == htons(seq))&lt;br /&gt;                  {&lt;br /&gt;                      gettimeofday(&amp;tv, &amp;tz);&lt;br /&gt;                      delay = (tv.tv_sec) - (tp-&gt;tv_sec) + (tv.tv_usec) - (tp-&gt;tv_usec);&lt;br /&gt;                      printf("64 bytes from %s icmp_seq=%d ttl=%d delay=%.3fms\n",ip_ntoa(ntohl(ip-&gt;saddr)),seq,ip-&gt;ttl,(delay/1000));&lt;br /&gt;                      received++;&lt;br /&gt;                      t_sum += (delay/1000);&lt;br /&gt;                  }&lt;br /&gt;              }&lt;br /&gt;         }&lt;br /&gt;         sleep(1);&lt;br /&gt;    }&lt;br /&gt;    return ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unsigned short check_sum(unsigned char *buf, int len)&lt;br /&gt;{&lt;br /&gt;    unsigned short len_16 = 0;&lt;br /&gt;    unsigned int len_32 = 0;&lt;br /&gt;    int i;&lt;br /&gt;    &lt;br /&gt;    for(i =0; i &lt; len; i+=2)&lt;br /&gt;    {&lt;br /&gt;        len_16 = (buf[i] &lt;&lt; 8)&amp;0xff00 | buf[i+1]&amp;0xff; &lt;br /&gt;        len_32 += len_16;&lt;br /&gt;    }&lt;br /&gt;    if(len_32 &gt;&gt; 16)&lt;br /&gt;    {&lt;br /&gt;        len_32 = ((len_32&gt;&gt;16)&amp;0xffff) + (len_32&amp;0xffff);&lt;br /&gt;    }&lt;br /&gt;    if(len_32 &gt;&gt; 16)&lt;br /&gt;    {&lt;br /&gt;        len_32 = ((len_32&gt;&gt;16)&amp;0xffff) + (len_32&amp;0xffff);&lt;br /&gt;    }&lt;br /&gt;    len_32 = ~len_32;&lt;br /&gt;&lt;br /&gt;    return (len_32&amp;0xffff);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-2628496528503538291?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/2628496528503538291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2010/03/kid-ping-utility.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/2628496528503538291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/2628496528503538291'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2010/03/kid-ping-utility.html' title='Kid Ping Utility'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-9098888134004690240</id><published>2010-03-07T09:11:00.000-08:00</published><updated>2010-03-07T09:37:36.956-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='raw socket'/><category scheme='http://www.blogger.com/atom/ns#' term='packet sniffer'/><category scheme='http://www.blogger.com/atom/ns#' term='LINUX'/><title type='text'>Kid Sniffer</title><content type='html'>/**************************************************************************&lt;br /&gt; * Author       : Chaitanya bhargav M&lt;br /&gt; * date Created : 07 March 2010&lt;br /&gt; * License      : free, but unreliable&lt;br /&gt; * ************************************************************************/&lt;br /&gt;#include unistd.h&lt;br /&gt;#include stdio.h&lt;br /&gt;#include net/if.h&lt;br /&gt;#include sys/socket.h&lt;br /&gt;#include sys/types.h&lt;br /&gt;#include sys/time.h&lt;br /&gt;#include string.h&lt;br /&gt;#include stdlib.h&lt;br /&gt;#include linux/in.h&lt;br /&gt;#include netinet/ether.h&lt;br /&gt;#include linux/if_ether.h&lt;br /&gt;#include linux/if_packet.h&lt;br /&gt;#include linux/ip.h&lt;br /&gt;#include linux/icmp.h&lt;br /&gt;#include linux/udp.h&lt;br /&gt;#include linux/tcp.h&lt;br /&gt;#include signal.h&lt;br /&gt;#include linux/if_vlan.h&lt;br /&gt;#include linux/if_arp.h&lt;br /&gt;&lt;br /&gt;/************************** &lt;br /&gt; * Namesake signal Handler&lt;br /&gt; **************************/&lt;br /&gt;void signal_handle(int sigNum)&lt;br /&gt;{&lt;br /&gt;     printf("Received the signal : %d",sigNum);&lt;br /&gt;     exit(128);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*********************************************************&lt;br /&gt; * Converts ipAddress in integer to dotted decimal format&lt;br /&gt; *********************************************************/&lt;br /&gt;char *ip_ntoa(unsigned int ip)&lt;br /&gt;{&lt;br /&gt;     char *str = (char *)malloc(16*sizeof(char));&lt;br /&gt;     sprintf(str,"%d.%d.%d.%d",(ip&amp;0xff000000)&gt;&gt;24,&lt;br /&gt;                               (ip&amp;0x00ff0000)&gt;&gt;16,&lt;br /&gt;                               (ip&amp;0x0000ff00)&gt;&gt;8,&lt;br /&gt;                               (ip&amp;0x000000ff));&lt;br /&gt;     return str;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*****************************&lt;br /&gt; * Process packets in Layer 3 &lt;br /&gt; *****************************/&lt;br /&gt;void process_ip_packet(unsigned char *buf, int len)&lt;br /&gt;{&lt;br /&gt;     struct iphdr *ip;&lt;br /&gt;     struct icmphdr *icmp;&lt;br /&gt;     struct udphdr *udp;&lt;br /&gt;     struct tcphdr *tcp;&lt;br /&gt;&lt;br /&gt;     //printf("Received a packet with size:%d\n",len);&lt;br /&gt;     ip = (struct iphdr *)(buf );&lt;br /&gt;     printf("ip_src:%s &gt; ip_dst:%s,", ip_ntoa(ntohl(ip-&gt;saddr)),ip_ntoa(ntohl(ip-&gt;daddr)));&lt;br /&gt;     switch( ip-&gt;protocol)&lt;br /&gt;     {&lt;br /&gt;      case IPPROTO_ICMP:&lt;br /&gt;          icmp = (struct icmphdr *)(buf + (ip-&gt;ihl &lt;&lt; 2));&lt;br /&gt;          if(icmp-&gt;type == ICMP_ECHO)&lt;br /&gt;          {&lt;br /&gt;              printf("ICMP Echo req \n");&lt;br /&gt;          }&lt;br /&gt;          else if(icmp-&gt;type == ICMP_ECHOREPLY)&lt;br /&gt;          {&lt;br /&gt;              printf("ICMP Echo reply \n");&lt;br /&gt;          }&lt;br /&gt;          else if(icmp-&gt;type == ICMP_DEST_UNREACH)&lt;br /&gt;          {   &lt;br /&gt;              printf("ICMP Destination Unreachable\n");&lt;br /&gt;          }&lt;br /&gt;          break;&lt;br /&gt;      case IPPROTO_UDP:&lt;br /&gt;          udp = (struct udphdr *)(buf + (ip-&gt;ihl &lt;&lt; 2));&lt;br /&gt;          printf("UDP, src: %d, dest: %d\n",ntohs(udp-&gt;source), ntohs(udp-&gt;dest));&lt;br /&gt;          break;&lt;br /&gt;      case IPPROTO_TCP:&lt;br /&gt;          tcp = (struct tcphdr *)(buf + (ip-&gt;ihl &lt;&lt; 2));&lt;br /&gt;          printf("TCP, src: %d, dest: %d\n",ntohs(tcp-&gt;source), ntohs(tcp-&gt;dest));&lt;br /&gt;          break;&lt;br /&gt;      default:&lt;br /&gt;          printf("Unconcerned IP Protocol:0x%04x\n",ip-&gt;protocol);&lt;br /&gt;          break;&lt;br /&gt;     }&lt;br /&gt;     return ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/********************************&lt;br /&gt; * Process packets in Link Layer&lt;br /&gt; ********************************/&lt;br /&gt;void process_frame(unsigned char *buffer, int len)&lt;br /&gt;{&lt;br /&gt;     //printf("Received a packet with size:%d\n",len);&lt;br /&gt;     struct ethhdr *eth;&lt;br /&gt;     struct vlan_ethhdr *vlaneth;&lt;br /&gt;     struct iphdr *ip;&lt;br /&gt;     struct arp_hdr *arp;&lt;br /&gt;&lt;br /&gt;     eth = (struct ethhdr *) buffer;&lt;br /&gt;     printf("%02x:%02x:%02x:%02x:%02x:%02x &gt; %02x:%02x:%02x:%02x:%02x:%02x,",eth-&gt;h_source[0],eth-&gt;h_source[1],&lt;br /&gt;                                                                            eth-&gt;h_source[2],eth-&gt;h_source[3],&lt;br /&gt;                                                                            eth-&gt;h_source[4],eth-&gt;h_source[5],&lt;br /&gt;                                                                            eth-&gt;h_dest[0],eth-&gt;h_dest[1],&lt;br /&gt;                                                                            eth-&gt;h_dest[2],eth-&gt;h_dest[3],&lt;br /&gt;                                                                            eth-&gt;h_dest[4],eth-&gt;h_dest[5]);&lt;br /&gt;     switch(ntohs(eth-&gt;h_proto))&lt;br /&gt;     {&lt;br /&gt;      case ETH_P_ARP:&lt;br /&gt;          arp = (struct arp_hdr *)(buffer + ETH_HLEN);&lt;br /&gt;          if(ntohs(arp-&gt;ar_op) == ARPOP_REQUEST)&lt;br /&gt;          {&lt;br /&gt;              printf("ARP Request for IP:%d.%d.%d.%d tell IP:%d.%d.%d.%d\n",arp-&gt;ar_tip[0],arp-&gt;ar_tip[1],arp-&gt;ar_tip[2],arp-&gt;ar_tip[3],&lt;br /&gt;                                                                            arp-&gt;ar_sip[0],arp-&gt;ar_sip[1],arp-&gt;ar_sip[2],arp-&gt;ar_sip[3]);&lt;br /&gt;          }&lt;br /&gt;          else if(ntohs(arp-&gt;ar_op) == ARPOP_REPLY)&lt;br /&gt;          {&lt;br /&gt;              printf("ARP Reply for IP:%d.%d.%d.%d is MAC:%02x:%02x:%02x:%02x:%02x:%02x\n",arp-&gt;ar_sip[0],arp-&gt;ar_sip[1],arp-&gt;ar_sip[2],arp-&gt;ar_sip[3],&lt;br /&gt;                                             arp-&gt;ar_sha[0],arp-&gt;ar_sha[1],arp-&gt;ar_sha[2],arp-&gt;ar_sha[3],arp-&gt;ar_sha[4],arp-&gt;ar_sha[5]);                           }&lt;br /&gt;          break;&lt;br /&gt;                                                      &lt;br /&gt;      case ETH_P_8021Q:&lt;br /&gt;          break;&lt;br /&gt;&lt;br /&gt;      case ETH_P_IP:&lt;br /&gt;          process_ip_packet( buffer+ETH_HLEN, len-ETH_HLEN);&lt;br /&gt;          break;&lt;br /&gt;&lt;br /&gt;      case ETH_P_IPV6:&lt;br /&gt;          printf("IPV6 packet\n");&lt;br /&gt;          break;&lt;br /&gt;&lt;br /&gt;      default:&lt;br /&gt;          printf("Some strange protocol:0x%04x\n",ntohs(eth-&gt;h_proto));&lt;br /&gt;          break;&lt;br /&gt;     }&lt;br /&gt;     return ; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**************************************************&lt;br /&gt; * Main Function: Accessing the packets from stack&lt;br /&gt; **************************************************/&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;     int fd,retVal = 0,sin_size,data_size;&lt;br /&gt;     unsigned char buffer[1522];&lt;br /&gt;     struct sockaddr_in sin;&lt;br /&gt;&lt;br /&gt;     fd = socket(PF_PACKET, SOCK_RAW,htons(ETH_P_ALL) );&lt;br /&gt;     if(fd == -1)&lt;br /&gt;     {&lt;br /&gt;         perror("Raw socket");&lt;br /&gt;         exit(127);&lt;br /&gt;     }&lt;br /&gt;    &lt;br /&gt;     signal(SIGINT, signal_handle);&lt;br /&gt;     signal(SIGSEGV, signal_handle);&lt;br /&gt;     signal(SIGFPE, signal_handle);&lt;br /&gt;&lt;br /&gt;     sin_size = sizeof sin;&lt;br /&gt;     while(1)&lt;br /&gt;     {&lt;br /&gt;         data_size = recvfrom(fd, buffer, 1518, 0,(struct sockaddr *) &amp;sin, &amp;sin_size);&lt;br /&gt;         process_frame(buffer, data_size);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     return 0;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;//============= E O F =================&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-9098888134004690240?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/9098888134004690240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2010/03/author-chaitanya-bhargav-m-date-created.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/9098888134004690240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/9098888134004690240'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2010/03/author-chaitanya-bhargav-m-date-created.html' title='Kid Sniffer'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-3404383812070674045</id><published>2009-12-14T19:42:00.000-08:00</published><updated>2009-12-14T19:43:12.543-08:00</updated><title type='text'>Sending ICMP request using C program</title><content type='html'>/**********************************************************************************&lt;br /&gt; * AUTHOR      :  Chaitanya bhargav M&lt;br /&gt; * Date        :  14/10/2009&lt;br /&gt; * description : To send an icmp request to specified host via specified &lt;br /&gt; *               Interface.&lt;br /&gt; * License     : Never mind to do any thing with this code.But, it might be unreliable&lt;br /&gt; * *********************************************************************************&lt;br /&gt; * CopyLeft(c) Chaitanya bhargav M  2009&lt;br /&gt; ***********************************************************************************/&lt;br /&gt;#include&lt;sys/socket.h&gt;&lt;br /&gt;#include&lt;sys/types.h&gt;&lt;br /&gt;#include&lt;net/if.h&gt;&lt;br /&gt;#include&lt;netinet/in.h&gt;&lt;br /&gt;#include&lt;netinet/ether.h&gt;&lt;br /&gt;#include&lt;arpa/inet.h&gt;&lt;br /&gt;#include&lt;sys/ioctl.h&gt;&lt;br /&gt;#include&lt;unistd.h&gt;&lt;br /&gt;#include&lt;string.h&gt;&lt;br /&gt;#include&lt;stdio.h&gt;&lt;br /&gt;#include&lt;stdlib.h&gt;&lt;br /&gt;#include&lt;net/ethernet.h&gt;&lt;br /&gt;#include&lt;netdb.h&gt;&lt;br /&gt;#include&lt;netpacket/packet.h&gt;&lt;br /&gt;&lt;br /&gt;typedef unsigned long int  uint32;&lt;br /&gt;typedef unsigned short int uint16;&lt;br /&gt;typedef unsigned char       uint8;&lt;br /&gt;&lt;br /&gt;#define ETHER_TYPE_FOR_IP 0x0800&lt;br /&gt;#define PROTOCOL_ICMP     0x01&lt;br /&gt;&lt;br /&gt;// For proper memory allocation for each packet&lt;br /&gt;#pragma pack(1)&lt;br /&gt;// Ethernet header&lt;br /&gt;typedef struct eth_hdr&lt;br /&gt;{&lt;br /&gt;    uint8 dest_mac[6];&lt;br /&gt;    uint8 src_mac[6];&lt;br /&gt;    uint16 ether_type;&lt;br /&gt;}ETH_HDR;&lt;br /&gt;// 802.1Q Header&lt;br /&gt;typedef struct vlan_hdr&lt;br /&gt;{&lt;br /&gt;    uint16 type;&lt;br /&gt;    uint16 vlanID;&lt;br /&gt;}VLAN_HDR;&lt;br /&gt;// IP Header without options&lt;br /&gt;typedef struct ip_hdr&lt;br /&gt;{&lt;br /&gt;    uint8 version_headerlen;&lt;br /&gt;    uint8 diffserv;&lt;br /&gt;    uint16 total_len;&lt;br /&gt;    uint16 ident;&lt;br /&gt;    uint8  flags;&lt;br /&gt;    uint8  frag_offset;&lt;br /&gt;    uint8  ttl;&lt;br /&gt;    uint8  protocol;&lt;br /&gt;    uint16 checksum;&lt;br /&gt;    uint32 src_addr;&lt;br /&gt;    uint32 dest_addr;&lt;br /&gt;}IP_HDR;&lt;br /&gt;// ICMP Header&lt;br /&gt;typedef struct icmp_hdr&lt;br /&gt;{&lt;br /&gt;    uint8 type;&lt;br /&gt;    uint8 code;&lt;br /&gt;    uint16 checksum;&lt;br /&gt;    uint16 ident;&lt;br /&gt;    uint16 seq_no;&lt;br /&gt;}ICMP_HDR;&lt;br /&gt;// My own ICMP packet&lt;br /&gt;typedef struct icmp_packet&lt;br /&gt;{&lt;br /&gt;    ETH_HDR eth;&lt;br /&gt;    IP_HDR  ip;&lt;br /&gt;    ICMP_HDR icmp;&lt;br /&gt;    uint8 data[32];&lt;br /&gt;}ICMP_PKT;&lt;br /&gt;&lt;br /&gt;// Function prototypes to calculate checksum and to print packet&lt;br /&gt;unsigned short int header_checksum(char *, unsigned short int );&lt;br /&gt;int print_pkt( char *, unsigned short int );&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    struct sockaddr_in *sin;&lt;br /&gt;    struct ifreq ifr;&lt;br /&gt;    struct sockaddr_ll sa; &lt;br /&gt;    int if_fd,icmp_fd,retVal,arp_flagg = 1;&lt;br /&gt;    unsigned long int ipAddr,IfIndex;&lt;br /&gt;    unsigned char IfMac[6];&lt;br /&gt;    ICMP_PKT pkt;&lt;br /&gt;    // It's my gateway. So, i am hardcoding&lt;br /&gt;    unsigned char gateway[7] = { 0x00,0x1A,0x6D,0x2B,0x89,0x29 };&lt;br /&gt;&lt;br /&gt;    if(argc != 3)&lt;br /&gt;    {&lt;br /&gt;       printf("Usage:\n ./icmp_req &lt;IfName&gt; &lt;IP&gt;\n");&lt;br /&gt;       exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if(getuid() &amp;&amp; geteuid())&lt;br /&gt;    {   &lt;br /&gt;        printf("Oops!\n No Super user right\n");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Check for default gateway&lt;br /&gt;    if(!strcmp(argv[1],"eth0"))&lt;br /&gt;    {&lt;br /&gt;        arp_flagg = 0;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if_fd = socket(AF_INET, SOCK_DGRAM, 0);&lt;br /&gt;    if( if_fd &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("If Socket");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //==============================Interface related data======================&lt;br /&gt;    // provide Interface name&lt;br /&gt;    strcpy(ifr.ifr_name,argv[1]);    &lt;br /&gt;&lt;br /&gt;    // IP address&lt;br /&gt;    retVal = ioctl( if_fd, SIOCGIFADDR, &amp;ifr, sizeof(ifr));&lt;br /&gt;    if( retVal &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("IFADDR IOCTL");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;    sin = (struct sockaddr_in *)&amp;ifr.ifr_addr;&lt;br /&gt;    ipAddr = ntohl(sin-&gt;sin_addr.s_addr);&lt;br /&gt;&lt;br /&gt;#ifdef DBG_ICMP&lt;br /&gt;    printf("IpAddr = %s\n",inet_ntoa(sin-&gt;sin_addr));&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;    // MAC address &lt;br /&gt;    retVal = ioctl(if_fd, SIOCGIFHWADDR, &amp;ifr, sizeof(ifr));&lt;br /&gt;    if( retVal &lt; 0)&lt;br /&gt;    {&lt;br /&gt;        perror("IFHWADDR IOCTL");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;    memcpy(IfMac, ifr.ifr_hwaddr.sa_data, 6 * sizeof(unsigned char));&lt;br /&gt;&lt;br /&gt;#ifdef DBG_ICMP&lt;br /&gt;    printf("MAC = %02x:%02x:%02x:%02x:%02x:%02x\n", IfMac[0],IfMac[1],IfMac[2],IfMac[3],IfMac[4],IfMac[5]);&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;    // Interface index&lt;br /&gt;    retVal = ioctl(if_fd, SIOCGIFINDEX, &amp;ifr, sizeof(ifr));&lt;br /&gt;    if( retVal &lt; 0)&lt;br /&gt;    {&lt;br /&gt;        perror("IFINDEX");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;#ifdef DBG_ICMP&lt;br /&gt;    printf("IfIndex = %d\n",ifr.ifr_ifindex); &lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;    IfIndex = ifr.ifr_ifindex;&lt;br /&gt;    //==============================Interface related data=====================&lt;br /&gt;&lt;br /&gt;    //==============================Packet socket==============================&lt;br /&gt;&lt;br /&gt;    icmp_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));&lt;br /&gt;    if(icmp_fd &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("ICMP Socket");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    //=============================Frame the packet============================&lt;br /&gt;    // Ethernet header&lt;br /&gt;    if(!arp_flagg) // If sending via gateway&lt;br /&gt;    {&lt;br /&gt;        memcpy(pkt.eth.dest_mac, gateway, 6 * sizeof(unsigned char));&lt;br /&gt;    }&lt;br /&gt;    else           // If sending via private interface&lt;br /&gt;    {&lt;br /&gt;        memset(pkt.eth.dest_mac, 0xFF, 6 * sizeof(unsigned char));&lt;br /&gt;    }&lt;br /&gt;    memcpy(pkt.eth.src_mac, IfMac, 6 * sizeof(unsigned char));&lt;br /&gt;    pkt.eth.ether_type = htons(ETHER_TYPE_FOR_IP);&lt;br /&gt;&lt;br /&gt;    // IP header&lt;br /&gt;    pkt.ip.version_headerlen = 0x45;              // version = IPv4, len = 5 (x 32 = 160)&lt;br /&gt;    pkt.ip.diffserv          = 0x00;              // Best effort&lt;br /&gt;    pkt.ip.total_len         = htons(0x003C);     // 20 IP header + 8 UDP header + 32 data&lt;br /&gt;    pkt.ip.ident             = htons(0xa9b1);     // just to identify reply&lt;br /&gt;    pkt.ip.flags             = 0x00;              // no fragmentation &lt;br /&gt;    pkt.ip.frag_offset       = htons(0x0000);     // no fragmentaion&lt;br /&gt;    pkt.ip.ttl               = 0x80;              // let's give 128&lt;br /&gt;    pkt.ip.protocol          = PROTOCOL_ICMP;     // ICMP protocol inside IP&lt;br /&gt;    pkt.ip.checksum          = htons(0x0000);     // Will be found out after framing full header&lt;br /&gt;    pkt.ip.src_addr          = htonl(ipAddr);     // inet address of given Interface&lt;br /&gt;    pkt.ip.dest_addr         = inet_addr(argv[2]);// to whom shall we send&lt;br /&gt;&lt;br /&gt;    pkt.ip.checksum          = htons(header_checksum( (char *)&amp;pkt.ip.version_headerlen, 20)); &lt;br /&gt;    &lt;br /&gt;    // ICMP header&lt;br /&gt;    pkt.icmp.type            = 0x08;              // ICMP request&lt;br /&gt;    pkt.icmp.code            = 0x00;              // Code for ICMP request&lt;br /&gt;    pkt.icmp.checksum        = htons(0x0000);     // Will be filled after framing full header&lt;br /&gt;    pkt.icmp.ident           = htons(0x0300);     // anything &lt;br /&gt;    pkt.icmp.seq_no          = htons(0xC000);     // anything&lt;br /&gt;  &lt;br /&gt;    pkt.icmp.checksum        = htons(header_checksum( (char *)&amp;pkt.icmp.type, 8));&lt;br /&gt;&lt;br /&gt;    // Data padding&lt;br /&gt;    memset(pkt.data, 0, 32 * sizeof(unsigned char));// Windows(R) Style &lt;br /&gt;&lt;br /&gt;#ifndef DBG_ICMP&lt;br /&gt;    print_pkt((char *)&amp;pkt, sizeof(pkt));&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;   //======================Ok, Now send it!================&lt;br /&gt;&lt;br /&gt;   // We need this to send the packet&lt;br /&gt;   sa.sll_family    = AF_PACKET;                  // AF_PACKET is a must&lt;br /&gt;   sa.sll_ifindex  = ifr.ifr_ifindex;             // chosen if. index number&lt;br /&gt;   sa.sll_protocol = htons(ETH_P_IP);             // protocol of interest&lt;br /&gt;&lt;br /&gt;   // Now send it!&lt;br /&gt;   retVal = sendto(icmp_fd, &amp;pkt, sizeof(pkt), 0, (struct sockaddr *)&amp;sa, sizeof(sa));&lt;br /&gt;   if(retVal &lt; 0 )&lt;br /&gt;   {&lt;br /&gt;      perror("send to");&lt;br /&gt;      close(icmp_fd);&lt;br /&gt;      close(if_fd);&lt;br /&gt;      exit(1);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/***********************************************************&lt;br /&gt; *    To find the checksum of any header     &lt;br /&gt; * Description: &lt;br /&gt; * - add two bytes at a time till the end&lt;br /&gt; * - add the overflow till you come up with a 2-byte result&lt;br /&gt; * - take a 1's compliment &lt;br /&gt; ***********************************************************/&lt;br /&gt;unsigned short int header_checksum(char *buf, unsigned short int len)&lt;br /&gt;{&lt;br /&gt;    unsigned char *header;&lt;br /&gt; &lt;br /&gt;    unsigned short int low16 = 0,i = 0;&lt;br /&gt;    unsigned long int checksum_32 =0;&lt;br /&gt; &lt;br /&gt;    // add 2 bytes at a time&lt;br /&gt;    for(i = 0; i &lt; len; i+=2 )&lt;br /&gt;    {&lt;br /&gt;        low16 = (buf[i] &lt;&lt; 8)&amp;0xFF00 | buf[i+1]&amp;0xFF ;&lt;br /&gt;        checksum_32 = checksum_32 + low16;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    // Append the overflow  -- 2 times for safety&lt;br /&gt;    if(checksum_32 &gt;&gt; 16)&lt;br /&gt;    {&lt;br /&gt;        checksum_32 = (checksum_32 &amp; 0xFFFF) + (checksum_32 &gt;&gt; 16);&lt;br /&gt;    }&lt;br /&gt;    if(checksum_32 &gt;&gt; 16)&lt;br /&gt;    {&lt;br /&gt;        checksum_32 = (checksum_32 &amp; 0xFFFF) + (checksum_32 &gt;&gt; 16);&lt;br /&gt;    }&lt;br /&gt;    // One's compliment&lt;br /&gt;    checksum_32 = ~checksum_32;&lt;br /&gt; &lt;br /&gt;    return (checksum_32&amp;0xFFFF);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**********************************************&lt;br /&gt; *    To Print the packet                     *&lt;br /&gt; **********************************************/&lt;br /&gt;int print_pkt( char *buf, unsigned short int len)&lt;br /&gt;{&lt;br /&gt;    int i = 0;&lt;br /&gt;&lt;br /&gt;    printf("Size of packet = %d\n",len);&lt;br /&gt;    for( i = 0; i &lt; len ; i++)&lt;br /&gt;    {&lt;br /&gt;        if(i%16 == 0)&lt;br /&gt;        printf("\n");&lt;br /&gt;&lt;br /&gt;        printf("%02x ",buf[i]&amp;0xff);&lt;br /&gt;    }&lt;br /&gt;    printf("\n");&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-3404383812070674045?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/3404383812070674045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2009/12/sending-icmp-request-using-c-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/3404383812070674045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/3404383812070674045'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2009/12/sending-icmp-request-using-c-program.html' title='Sending ICMP request using C program'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-7086479805811644864</id><published>2009-12-06T22:11:00.000-08:00</published><updated>2009-12-06T22:28:57.168-08:00</updated><title type='text'>Reading routing table using C program</title><content type='html'>#include"sys/socket.h"&lt;br /&gt;#include"sys/types.h"&lt;br /&gt;#include"unistd.h"&lt;br /&gt;#include"stdio.h"&lt;br /&gt;#include"stdlib.h"&lt;br /&gt;#include"string.h"&lt;br /&gt;#include"asm/types.h"&lt;br /&gt;#include"linux/netlink.h"&lt;br /&gt;#include"linux/rtnetlink.h"&lt;br /&gt;#include"sys/ioctl.h"&lt;br /&gt;#include"net/if.h"&lt;br /&gt;#include"net/route.h"&lt;br /&gt;&lt;br /&gt;#pragma pack(2)&lt;br /&gt;// Structure for sending the request&lt;br /&gt;typedef struct &lt;br /&gt;{&lt;br /&gt;    struct nlmsghdr nlMsgHdr;&lt;br /&gt;    struct rtmsg    rtMsg;&lt;br /&gt;    char            buf[1024];&lt;br /&gt;}route_request;&lt;br /&gt;&lt;br /&gt;// Structure for storing routes&lt;br /&gt;struct RouteInfo&lt;br /&gt;{&lt;br /&gt;    unsigned long   dstAddr;&lt;br /&gt;    unsigned long   mask;&lt;br /&gt;    unsigned long   gateWay;&lt;br /&gt;    unsigned long   flags;&lt;br /&gt;    unsigned long   srcAddr;&lt;br /&gt;    unsigned char   proto;&lt;br /&gt;    char            ifName[IF_NAMESIZE];&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Function for accessing interface name&lt;br /&gt;int ifname(int ,char *); &lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    int route_sock,i,j;&lt;br /&gt;    route_request *request = (route_request *)malloc(sizeof(route_request));&lt;br /&gt;    int retValue = -1,nbytes = 0,reply_len = 0;&lt;br /&gt;    char reply_ptr[1024];&lt;br /&gt;    ssize_t counter = 1024;&lt;br /&gt;    int count =0;&lt;br /&gt;    struct rtmsg    *rtp;&lt;br /&gt;    struct rtattr   *rtap;&lt;br /&gt;    struct nlmsghdr *nlp;&lt;br /&gt;    int rtl;&lt;br /&gt;    struct RouteInfo route[24];&lt;br /&gt;    char* buf = reply_ptr;&lt;br /&gt;    unsigned long bufsize ;&lt;br /&gt;&lt;br /&gt;    if( argc &gt; 1)&lt;br /&gt;    {&lt;br /&gt;       if(getuid() &amp;&amp; geteuid()) &lt;br /&gt;       {&lt;br /&gt;           printf("Oops!\n Need SuperUser rights!\n");&lt;br /&gt;       }&lt;br /&gt;       exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    route_sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);     &lt;br /&gt;&lt;br /&gt;    bzero(request,sizeof(route_request));&lt;br /&gt;    &lt;br /&gt;    // Fill in the NETLINK header&lt;br /&gt;    request-&gt;nlMsgHdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));&lt;br /&gt;    request-&gt;nlMsgHdr.nlmsg_type = RTM_GETROUTE;&lt;br /&gt;    request-&gt;nlMsgHdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;&lt;br /&gt;&lt;br /&gt;    // set the routing message header&lt;br /&gt;    request-&gt;rtMsg.rtm_family = AF_INET;&lt;br /&gt;    request-&gt;rtMsg.rtm_table =  254; &lt;br /&gt;&lt;br /&gt;    // Send routing request&lt;br /&gt;    if ((retValue = send(route_sock, request, sizeof(route_request), 0)) &lt; 0)&lt;br /&gt;    {&lt;br /&gt;        perror("send");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    for(;;)&lt;br /&gt;    {&lt;br /&gt;        if( counter &lt; sizeof( struct nlmsghdr))&lt;br /&gt;        {&lt;br /&gt;            printf("Routing table is bigger than 1024\n");&lt;br /&gt;            exit(1);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        nbytes = recv(route_sock, &amp;reply_ptr[reply_len], counter, 0);&lt;br /&gt;         &lt;br /&gt;        if(nbytes &lt; 0 )&lt;br /&gt;        {&lt;br /&gt;            printf("Error in recv\n");&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if(nbytes == 0)&lt;br /&gt;            printf("EOF in netlink\n");&lt;br /&gt;&lt;br /&gt;        nlp = (struct nlmsghdr*)(&amp;reply_ptr[reply_len]);&lt;br /&gt;&lt;br /&gt;        if (nlp-&gt;nlmsg_type == NLMSG_DONE)&lt;br /&gt;        {&lt;br /&gt;            // All data has been received.&lt;br /&gt;            // Truncate the reply to exclude this message,&lt;br /&gt;            // i.e. do not increase reply_len.&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (nlp-&gt;nlmsg_type == NLMSG_ERROR)&lt;br /&gt;        {&lt;br /&gt;           printf("Error in msg\n");&lt;br /&gt;           exit(1);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        reply_len += nbytes;&lt;br /&gt;        counter -= nbytes;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;/*======================================================*/&lt;br /&gt;    bufsize = reply_len;&lt;br /&gt;    // string to hold content of the route&lt;br /&gt;    // table (i.e. one entry)&lt;br /&gt;    unsigned int flags;&lt;br /&gt;&lt;br /&gt;    // outer loop: loops thru all the NETLINK&lt;br /&gt;    // headers that also include the route entry&lt;br /&gt;    // header&lt;br /&gt;    nlp = (struct nlmsghdr *) buf;&lt;br /&gt;&lt;br /&gt;    for(i= -1; NLMSG_OK(nlp, bufsize); nlp=NLMSG_NEXT(nlp, bufsize))&lt;br /&gt;    {&lt;br /&gt;        // get route entry header&lt;br /&gt;        rtp = (struct rtmsg *) NLMSG_DATA(nlp);&lt;br /&gt;        // we are only concerned about the&lt;br /&gt;        // tableId route table&lt;br /&gt;        if(rtp-&gt;rtm_table != 254)&lt;br /&gt;            continue;&lt;br /&gt;        i++;&lt;br /&gt;        // init all the strings&lt;br /&gt;        bzero(&amp;route[i], sizeof(struct RouteInfo));&lt;br /&gt;        flags = rtp-&gt;rtm_flags;&lt;br /&gt;        route[i].proto = rtp-&gt;rtm_protocol;&lt;br /&gt;&lt;br /&gt;        // inner loop: loop thru all the attributes of&lt;br /&gt;        // one route entry&lt;br /&gt;        rtap = (struct rtattr *) RTM_RTA(rtp);&lt;br /&gt;        rtl = RTM_PAYLOAD(nlp);&lt;br /&gt;        for( ; RTA_OK(rtap, rtl); rtap = RTA_NEXT(rtap, rtl))&lt;br /&gt;        {&lt;br /&gt;            switch(rtap-&gt;rta_type)&lt;br /&gt;            {&lt;br /&gt;                // destination IPv4 address&lt;br /&gt;                case RTA_DST:&lt;br /&gt;                    count =  32 - rtp-&gt;rtm_dst_len;&lt;br /&gt;&lt;br /&gt;                    route[i].dstAddr = *(unsigned long *) RTA_DATA(rtap);&lt;br /&gt;&lt;br /&gt;                    route[i].mask = 0xffffffff;&lt;br /&gt;                    for (; count!=0 ;count--)&lt;br /&gt;                        route[i].mask = route[i].mask &lt;&lt; 1;&lt;br /&gt;&lt;br /&gt;                    //printf("dst:%s    \tmask:0x%x   \t",inet_ntoa(route[i].dstAddr), route[i].mask);&lt;br /&gt;                    break;&lt;br /&gt;                case RTA_GATEWAY:&lt;br /&gt;                    route[i].gateWay = *(unsigned long *) RTA_DATA(rtap);&lt;br /&gt;                    //printf("gw:%s\t",inet_ntoa(route[i].gateWay));&lt;br /&gt;                    break;&lt;br /&gt;                case RTA_PREFSRC:&lt;br /&gt;                    route[i].srcAddr = *(unsigned long *) RTA_DATA(rtap);&lt;br /&gt;                    //printf("src:%s\t", inet_ntoa(route[i].srcAddr));&lt;br /&gt;                    break;&lt;br /&gt;                    // unique ID associated with the network&lt;br /&gt;                    // interface&lt;br /&gt;                case RTA_OIF:&lt;br /&gt;                    ifname(*((int *) RTA_DATA(rtap)),route[i].ifName);&lt;br /&gt;                    //printf( "ifname %s\n", route[i].ifName);&lt;br /&gt;                    break;&lt;br /&gt;                default:&lt;br /&gt;                    break;&lt;br /&gt;            }&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;        //set Flags&lt;br /&gt;&lt;br /&gt;        //[TODO]: UP hardcoded?!&lt;br /&gt;        route[i].flags|=RTF_UP;&lt;br /&gt;        if (route[i].gateWay != 0)&lt;br /&gt;            route[i].flags|=RTF_GATEWAY;&lt;br /&gt;        if (route[i].mask == 0xFFFFFFFF)&lt;br /&gt;            route[i].flags|=RTF_HOST;  &lt;br /&gt;    } &lt;br /&gt;&lt;br /&gt;    // Print the route records&lt;br /&gt;    printf("Destination\tGateway  \tNetmask \tflags \tIfname \n");&lt;br /&gt;    printf("-----------\t-------  \t--------\t------\t------ \n");&lt;br /&gt;    for( j = 0; j&lt;= i; j++)&lt;br /&gt;    {&lt;br /&gt;        printf("%s \t0x%08x\t0x%08x \t%d  \t%s\n",&lt;br /&gt;                         inet_ntoa(route[j].dstAddr),&lt;br /&gt;                         ntohl(route[j].gateWay),&lt;br /&gt;                         route[j].mask,&lt;br /&gt;                         route[j].flags,&lt;br /&gt;                         route[j].ifName);&lt;br /&gt;    }&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*--------------------------------------------------------------&lt;br /&gt; * To get the name of the interface provided the interface index&lt;br /&gt; *--------------------------------------------------------------*/&lt;br /&gt;int ifname(int if_index,char *ifName)&lt;br /&gt;{&lt;br /&gt;    int fd,retVal = -1;&lt;br /&gt;    struct sockaddr_in *sin;&lt;br /&gt;    struct ifreq ifr;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    fd = socket(AF_INET, SOCK_DGRAM, 0);  &lt;br /&gt;    if(fd == -1)&lt;br /&gt;    {&lt;br /&gt;        perror("socket");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ifr.ifr_ifindex = if_index;&lt;br /&gt;&lt;br /&gt;    if(ioctl(fd, SIOCGIFNAME, &amp;ifr, sizeof(ifr)))&lt;br /&gt;    {&lt;br /&gt;        perror("ioctl");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;    strcpy(ifName, ifr.ifr_name);&lt;br /&gt;    return ;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-7086479805811644864?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/7086479805811644864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2009/12/reading-routing-table-using-c-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/7086479805811644864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/7086479805811644864'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2009/12/reading-routing-table-using-c-program.html' title='Reading routing table using C program'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-5374012801407211266</id><published>2009-10-09T02:36:00.000-07:00</published><updated>2009-10-09T02:40:37.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ARP REQUEST'/><category scheme='http://www.blogger.com/atom/ns#' term='SOCKET programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C language'/><category scheme='http://www.blogger.com/atom/ns#' term='IOCTL'/><category scheme='http://www.blogger.com/atom/ns#' term='LINUX'/><title type='text'>Sending ARP request in LINUX using C</title><content type='html'>#include "sys/socket.h"&lt;br /&gt;#include "sys/types.h"&lt;br /&gt;#include "stdio.h"&lt;br /&gt;#include "unistd.h"&lt;br /&gt;#include "string.h"&lt;br /&gt;#include "net/if.h"&lt;br /&gt;#include "stdlib.h"&lt;br /&gt;#include "arpa/inet.h"&lt;br /&gt;#include "netinet/in.h"&lt;br /&gt;#include "sys/ioctl.h"&lt;br /&gt;#include "netpacket/packet.h"&lt;br /&gt;#include "net/ethernet.h"&lt;br /&gt;#include "netdb.h&lt;br /&gt;&lt;br /&gt;#define ETHER_TYPE_FOR_ARP   0x0806&lt;br /&gt;#define HW_TYPE_FOR_ETHER    0x0001&lt;br /&gt;#define OP_CODE_FOR_ARP_REQ  0x0001&lt;br /&gt;#define HW_LEN_FOR_ETHER       0x06&lt;br /&gt;#define HW_LEN_FOR_IP          0x04&lt;br /&gt;#define PROTO_TYPE_FOR_IP    0x0800&lt;br /&gt;&lt;br /&gt;typedef  unsigned char      byte1;&lt;br /&gt;typedef  unsigned short int byte2;&lt;br /&gt;typedef  unsigned long int  byte4;&lt;br /&gt;&lt;br /&gt;// For Proper memory allocation in the structure&lt;br /&gt;#pragma pack(1)&lt;br /&gt;typedef struct arp_packet &lt;br /&gt;{&lt;br /&gt;    // ETH Header &lt;br /&gt;    byte1 dest_mac[6];&lt;br /&gt;    byte1 src_mac[6];&lt;br /&gt;    byte2 ether_type;&lt;br /&gt;    // ARP Header&lt;br /&gt;    byte2 hw_type;&lt;br /&gt;    byte2 proto_type;&lt;br /&gt;    byte1 hw_size;&lt;br /&gt;    byte1 proto_size;&lt;br /&gt;    byte2 arp_opcode;&lt;br /&gt;    byte1 sender_mac[6];&lt;br /&gt;    byte4 sender_ip;&lt;br /&gt;    byte1 target_mac[6];&lt;br /&gt;    byte4 target_ip;&lt;br /&gt;    // Paddign&lt;br /&gt;    char padding[18];&lt;br /&gt;}ARP_PKT;&lt;br /&gt;&lt;br /&gt;int print_pkt(char *, int len);&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;    int arp_fd,if_fd,retVal;&lt;br /&gt;    struct sockaddr_in *sin;&lt;br /&gt;    struct sockaddr_ll  sa;&lt;br /&gt;    struct ifreq ifr;&lt;br /&gt;    ARP_PKT pkt;&lt;br /&gt;    unsigned long int ipAddr;&lt;br /&gt;   &lt;br /&gt;    if( argc != 3 )&lt;br /&gt;    {&lt;br /&gt;        printf("Usage: ./arp  &lt;IfName&gt;  &lt;IP&gt;\n");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;    else if( getuid() &amp;&amp; geteuid())&lt;br /&gt;    {&lt;br /&gt;        printf("Oops!\nDude you need SuperUser rights!\n");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /*=============================START of IP, MAC ADDRESS ACCESS========================*/&lt;br /&gt;&lt;br /&gt;    /* Open socket for accessing the IPv4 address of specified Interface */&lt;br /&gt;    if_fd = socket(AF_INET, SOCK_STREAM, 0); &lt;br /&gt;    if( if_fd &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("IF Socket");&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* provide interface name to ifreq structure */&lt;br /&gt;    memcpy(ifr.ifr_name, argv[1], IF_NAMESIZE);&lt;br /&gt;    /* IOCTL to get ip address */&lt;br /&gt;    retVal = ioctl(if_fd, SIOCGIFADDR, &amp;ifr, sizeof(ifr));&lt;br /&gt;    if( retVal &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("IOCTL");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* Simple typecasting for easy access to ip address */&lt;br /&gt;    sin = (struct sockaddr_in *)&amp;ifr.ifr_addr;&lt;br /&gt;    ipAddr = ntohl(sin-&gt;sin_addr.s_addr);&lt;br /&gt;#ifdef DBG_ARP&lt;br /&gt;    printf("IF Name: %s IP Address: %s ",argv[1], inet_ntoa(sin-&gt;sin_addr)); &lt;br /&gt;    printf("IP = 0x%x\n",ipAddr);&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;    retVal = ioctl(if_fd, SIOCGIFHWADDR, &amp;ifr, sizeof(ifr));&lt;br /&gt;    if( retVal &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("IOCTL");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;#ifdef DBG_ARP    &lt;br /&gt;    printf("MAC address: %s is %02x:%02x:%02x:%02x:%02x:%02x \n", &lt;br /&gt;                                                               argv[1],&lt;br /&gt;                                                               ifr.ifr_hwaddr.sa_data[0]&amp;0xFF, &lt;br /&gt;                                                               ifr.ifr_hwaddr.sa_data[1]&amp;0xFF, &lt;br /&gt;                                                               ifr.ifr_hwaddr.sa_data[2]&amp;0xFF, &lt;br /&gt;                                                               ifr.ifr_hwaddr.sa_data[3]&amp;0xFF, &lt;br /&gt;                                                               ifr.ifr_hwaddr.sa_data[4]&amp;0xFF, &lt;br /&gt;                                                               ifr.ifr_hwaddr.sa_data[5]&amp;0xFF);&lt;br /&gt;#endif&lt;br /&gt;  &lt;br /&gt;    /*-----------------------------END of IP,MAC ADDRESS ACCESS------------------------*/&lt;br /&gt;&lt;br /&gt;    /*=============================Start of ARP request sending====================*/&lt;br /&gt;    // Socket to send ARP packet &lt;br /&gt;    arp_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));&lt;br /&gt;    if( arp_fd == -1 )&lt;br /&gt;    {&lt;br /&gt;        perror("ARP Socket");&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    //====================== Formulate the ARP Packet ============================&lt;br /&gt;    // Ethernet Header&lt;br /&gt;    memset(pkt.dest_mac, 0xFF, (6 * sizeof(byte1)));&lt;br /&gt;    memset(pkt.src_mac,   (ifr.ifr_hwaddr.sa_data[0]&amp;0xFF),  sizeof(byte1));&lt;br /&gt;    memset(pkt.src_mac+1, (ifr.ifr_hwaddr.sa_data[1]&amp;0xFF),  sizeof(byte1));&lt;br /&gt;    memset(pkt.src_mac+2, (ifr.ifr_hwaddr.sa_data[2]&amp;0xFF),  sizeof(byte1));&lt;br /&gt;    memset(pkt.src_mac+3, (ifr.ifr_hwaddr.sa_data[3]&amp;0xFF),  sizeof(byte1));&lt;br /&gt;    memset(pkt.src_mac+4, (ifr.ifr_hwaddr.sa_data[4]&amp;0xFF),  sizeof(byte1));&lt;br /&gt;    memset(pkt.src_mac+5, (ifr.ifr_hwaddr.sa_data[5]&amp;0xFF),  sizeof(byte1));&lt;br /&gt;    pkt.ether_type   = htons(ETHER_TYPE_FOR_ARP); &lt;br /&gt;    // ARP Header&lt;br /&gt;    pkt.hw_type    = htons(HW_TYPE_FOR_ETHER);&lt;br /&gt;    pkt.proto_type = htons(PROTO_TYPE_FOR_IP);&lt;br /&gt;    pkt.hw_size    = HW_LEN_FOR_ETHER;&lt;br /&gt;    pkt.proto_size = HW_LEN_FOR_IP;&lt;br /&gt;    pkt.arp_opcode = htons(OP_CODE_FOR_ARP_REQ);&lt;br /&gt;    memcpy(pkt.sender_mac, pkt.src_mac, (6 * sizeof(byte1)));&lt;br /&gt;    pkt.sender_ip  = htonl(ipAddr);&lt;br /&gt;    memset(pkt.target_mac, 0 , (6 * sizeof(byte1)));&lt;br /&gt;    pkt.target_ip  = inet_addr(argv[2]);&lt;br /&gt;    // Padding&lt;br /&gt;    memset(pkt.padding, 0 , 18 * sizeof(byte1)); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // For sending the packet We need it!&lt;br /&gt;    retVal = ioctl(if_fd, SIOCGIFINDEX, &amp;ifr, sizeof(ifr));&lt;br /&gt;    if( retVal &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("IOCTL");&lt;br /&gt;        close(arp_fd);&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;    sa.sll_family    = AF_PACKET;&lt;br /&gt;    sa.sll_ifindex   = ifr.ifr_ifindex;&lt;br /&gt;    sa.sll_protocol  = htons(ETH_P_ARP);&lt;br /&gt;&lt;br /&gt;    /* Send it! */&lt;br /&gt;    retVal = sendto(arp_fd, &amp;pkt, sizeof(pkt), 0,(struct sockaddr *)&amp;sa, sizeof(sa));&lt;br /&gt;    if( retVal &lt; 0 )&lt;br /&gt;    {&lt;br /&gt;        perror("sendto");&lt;br /&gt;        close(arp_fd);&lt;br /&gt;        close(if_fd);&lt;br /&gt;        exit(1);&lt;br /&gt;    }&lt;br /&gt;   &lt;br /&gt;#ifdef DBG_ARP    &lt;br /&gt;    printf("\n=========PACKET=========\n");&lt;br /&gt;    print_pkt((void *)&amp;pkt, sizeof(pkt));&lt;br /&gt;#endif&lt;br /&gt;    return 0;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;int print_pkt(char *buf, int len)&lt;br /&gt;{&lt;br /&gt;    int j = 0;&lt;br /&gt;    for(j = 0; j &lt; len; j++ )&lt;br /&gt;    {&lt;br /&gt;        if((j%16) == 0 &amp;&amp; j != 0 )&lt;br /&gt;        printf("\n");&lt;br /&gt;        printf("%02x ",*(buf+j)&amp; 0xFF );&lt;br /&gt;    } &lt;br /&gt;    printf("\n");&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-5374012801407211266?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/5374012801407211266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2009/10/sending-arp-request-in-linux-using-c.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/5374012801407211266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/5374012801407211266'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2009/10/sending-arp-request-in-linux-using-c.html' title='Sending ARP request in LINUX using C'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-1669849078864594738</id><published>2009-09-29T20:31:00.000-07:00</published><updated>2009-09-29T20:36:57.754-07:00</updated><title type='text'>Read ARP entry Linux</title><content type='html'>/******************************************************&lt;br /&gt; Author      : Chaitu&lt;br /&gt; Date        : 29/09/2009&lt;br /&gt; Description : Reading MAC address from kernel arp table &lt;br /&gt;               in Linux&lt;br /&gt; *******************************************************/&lt;br /&gt;#include "sys/types.h"&lt;br /&gt;#include "sys/socket.h"&lt;br /&gt;#include "sys/time.h"&lt;br /&gt;#include "sys/ioctl.h"&lt;br /&gt;#include "net/route.h"&lt;br /&gt;#include "stdio.h"&lt;br /&gt;#include "errno.h"&lt;br /&gt;#include "stdlib.h"&lt;br /&gt;#include "string.h"&lt;br /&gt;#include "unistd.h"&lt;br /&gt;#include "arpa/inet.h"&lt;br /&gt;#include "netinet/ether.h"&lt;br /&gt;#include "netpacket/packet.h"&lt;br /&gt;#include "net/if.h"&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;   struct sockaddr_in *sin;&lt;br /&gt;   struct arpreq myreq;&lt;br /&gt;   int sockfd;&lt;br /&gt;&lt;br /&gt;   if(argc != 3)&lt;br /&gt;   { &lt;br /&gt;      printf("Usage:./mac &lt;interface&gt; &lt;ip&gt;\n");&lt;br /&gt;      exit(1);&lt;br /&gt;   }&lt;br /&gt;   /* Initialize the structure */&lt;br /&gt;   memset(&amp;myreq, '\0', sizeof(myreq)); &lt;br /&gt;&lt;br /&gt;   /* AF_INET family is must */&lt;br /&gt;   sin = (struct sockaddr_in *)&amp;myreq.arp_pa;&lt;br /&gt;   sin-&gt;sin_family = AF_INET;&lt;br /&gt;   sin-&gt;sin_addr.s_addr = inet_addr(argv[2]); // Give the IP for which MAC is needed&lt;br /&gt;&lt;br /&gt;   sin = (struct sockaddr_in *)&amp;myreq.arp_ha;&lt;br /&gt;   sin-&gt;sin_family = AF_INET;&lt;br /&gt;&lt;br /&gt;   memcpy(myreq.arp_dev,argv[1],IFNAMSIZ - 1);&lt;br /&gt;&lt;br /&gt;   /* Open socket for IOCTL operation */&lt;br /&gt;   if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)&lt;br /&gt;   {&lt;br /&gt;       perror("socket");&lt;br /&gt;       exit(1);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /* IOCTL for accessing the MAC address */&lt;br /&gt;   if((ioctl(sockfd, SIOCGARP,&amp;myreq, sizeof(myreq)) &lt; 0))&lt;br /&gt;   {&lt;br /&gt;       perror("ioctl");&lt;br /&gt;       close(sockfd);&lt;br /&gt;       exit(1);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   printf("mac address of IP:%s is  %02x:%02x:%02x:%02x:%02x:%02x\n", argv[2],( myreq.arp_ha.sa_data[0]&amp;0xFF),&lt;br /&gt;                                                                           (myreq.arp_ha.sa_data[1]&amp;0xFF),&lt;br /&gt;             (myreq.arp_ha.sa_data[2]&amp;0xFF),&lt;br /&gt;            (myreq.arp_ha.sa_data[3]&amp;0xFF),&lt;br /&gt;            (myreq.arp_ha.sa_data[4]&amp;0xFF),&lt;br /&gt;            (myreq.arp_ha.sa_data[5]&amp;0xFF));&lt;br /&gt;&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-1669849078864594738?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/1669849078864594738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2009/09/read-arp-entry-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/1669849078864594738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/1669849078864594738'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2009/09/read-arp-entry-linux.html' title='Read ARP entry Linux'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1974455674340917444.post-3573513815673906481</id><published>2009-08-30T08:54:00.000-07:00</published><updated>2009-08-30T08:55:30.077-07:00</updated><title type='text'>example for multi processing in linux</title><content type='html'>/*SERVER PROGRAM*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;&lt;br /&gt;struct sockaddr_in add2,add1;&lt;br /&gt;&lt;br /&gt;socklen_t len,len1;&lt;br /&gt;&lt;br /&gt;int i,j,k,l,z;&lt;br /&gt;&lt;br /&gt;int fm2[10];&lt;br /&gt;&lt;br /&gt;int fd[2];&lt;br /&gt;&lt;br /&gt;int ff1,ff2;&lt;br /&gt;int status;&lt;br /&gt;int pid,n;&lt;br /&gt;int sock2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void sigchld_handler()&lt;br /&gt;{&lt;br /&gt;read(fd[0],&amp;j,sizeof(int));&lt;br /&gt;read(fd[0],&amp;k,sizeof(int));&lt;br /&gt;&lt;br /&gt;i--;&lt;br /&gt;&lt;br /&gt;fm2[j]=0; //SETTING FIFO STATUS 0 FOR IDLE 1 FOR BUSY&lt;br /&gt;fm2[k]=0; //SETTING FIFO STATUS 0 FOR IDLE 1 FOR BUSY&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;printf("\nStatus Array at exit and i is %d\n",i);&lt;br /&gt;for(l=0;l&lt;10;l++)&lt;br /&gt;printf("%d\n",fm2[l]);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void sigint_handler()&lt;br /&gt;{&lt;br /&gt;printf("\nSERVER is being terminated........\n");&lt;br /&gt;if(pid!=getpid())&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;printf("\nClient Process with pid is %u Terminating\n",getpid())&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;n=1;&lt;br /&gt;write(ff2,&amp;n,sizeof(int));&lt;br /&gt;&lt;br /&gt;sleep(1);&lt;br /&gt;n=0;&lt;br /&gt;write(sock2,&amp;n,sizeof(int));&lt;br /&gt;&lt;br /&gt;shutdown(sock2,SHUT_RDWR);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sleep(1);&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void sigpipe_handler()&lt;br /&gt;{&lt;br /&gt;write(fd[1],&amp;j,sizeof(int));&lt;br /&gt;write(fd[1],&amp;k,sizeof(int));&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;int bin,sock,tmp;&lt;br /&gt;char ch='t';&lt;br /&gt;&lt;br /&gt;char fm1[10][3]={"f0","f1","f2","f3","f4","f5","f6","f7","f8","f9"};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//HANDLING CHILD PROCESS TERMINATION WHICH IS KILLED OR STOPPED&lt;br /&gt;&lt;br /&gt;signal(SIGCHLD,sigchld_handler);&lt;br /&gt;&lt;br /&gt;//HANDLING CTRL+Ci&lt;br /&gt;&lt;br /&gt;signal(SIGINT,sigint_handler);&lt;br /&gt;&lt;br /&gt;signal(SIGPIPE,sigpipe_handler);&lt;br /&gt;&lt;br /&gt;signal(SIGQUIT,sigint_handler);&lt;br /&gt;//PIPE CREATION FOR SENDING THE FIFO ARRAY STATUS&lt;br /&gt;&lt;br /&gt;pipe(fd);&lt;br /&gt;&lt;br /&gt;//SERVER SOCKET CREATION&lt;br /&gt;&lt;br /&gt;sock=socket(AF_INET,SOCK_STREAM,0);&lt;br /&gt;if(sock&lt;0)&lt;br /&gt;{&lt;br /&gt;perror("Server Socket Creation Error\n");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;add1.sin_port=htons(4500);&lt;br /&gt;add1.sin_addr.s_addr=INADDR_ANY;&lt;br /&gt;add1.sin_family=AF_INET;&lt;br /&gt;&lt;br /&gt;//BINDING SERVER SOCKET.&lt;br /&gt;&lt;br /&gt;if(bind(sock,(struct sockaddr *)&amp;add1,sizeof(add1))&lt;0)&lt;br /&gt;{&lt;br /&gt;perror("Binding Error\n");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//LISTENING FOR CONNECTIONS.&lt;br /&gt;&lt;br /&gt;i=listen(sock,5);&lt;br /&gt;if(i&lt;0)&lt;br /&gt;{&lt;br /&gt;perror("Listen error\n");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;pid=getpid();&lt;br /&gt;&lt;br /&gt;printf("\nServer Process id is %u\n",getpid());&lt;br /&gt;//SETTING FIFO ARRAY STATUS AS IDLE BEFORE ACCEPTING CLIENT CONNECTIONS&lt;br /&gt;&lt;br /&gt;for(i=0;i&lt;10;i++)&lt;br /&gt;fm2[i]=0;&lt;br /&gt;&lt;br /&gt;//i VALUE MAINTAINS NUMBER OF CONNECTIONS&lt;br /&gt;&lt;br /&gt;i=0;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;if(i&lt;5)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//ACCEPT SIGNAL&lt;br /&gt;&lt;br /&gt;sock2=accept(sock,(struct sockaddr *)&amp;add2,&amp;len1);&lt;br /&gt;if(sock2&lt;0)&lt;br /&gt;{&lt;br /&gt;perror("Accept Error\n");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// printf("\nI value is %d\n",i);&lt;br /&gt;&lt;br /&gt;//i VALUE IS INCREMENTED AS A NEW CLIENT CONNECTION ACCEPTED.&lt;br /&gt;&lt;br /&gt;i++;&lt;br /&gt;&lt;br /&gt;//FIFO MANAGEMENTSTARTING&lt;br /&gt;&lt;br /&gt;j=0;&lt;br /&gt;while(fm2[j]!=0)&lt;br /&gt;{&lt;br /&gt;j++;&lt;br /&gt;}&lt;br /&gt;fm2[j]=1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;k=0;&lt;br /&gt;while(fm2[k]!=0)&lt;br /&gt;{&lt;br /&gt;k++;&lt;br /&gt;}&lt;br /&gt;fm2[k]=1;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;printf("\nStatus Array before and i is %d\n",i);&lt;br /&gt;for(l=0;l&lt;10;l++)&lt;br /&gt;printf("%d\n",fm2[l]);&lt;br /&gt;//FIFO MANAGEMENT CLOSED&lt;br /&gt;&lt;br /&gt;//SPAWNING A NEW PROCESS FOR EACH AND EVERY NEW CLIENT CONNECTION&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pid=fork();&lt;br /&gt;if(pid==-1)&lt;br /&gt;{&lt;br /&gt;perror("FORK error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//EXECUTING THE CHILD PROCESS&lt;br /&gt;&lt;br /&gt;if(pid==0)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;//SENDING THE FIFO NAMES TO CLIENT THROUGH WHICH COMMUNICATION HAS TO BE DONE.&lt;br /&gt;&lt;br /&gt;write(sock2,&amp;fm1[j],2);&lt;br /&gt;write(sock2,&amp;fm1[k],2);&lt;br /&gt;&lt;br /&gt;ff1=open(fm1[j],O_RDONLY);&lt;br /&gt;if(ff1==-1)&lt;br /&gt;{&lt;br /&gt;perror("OPENING FIRST FIFO\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ff2=open(fm1[k],O_WRONLY);&lt;br /&gt;if(ff2==-1)&lt;br /&gt;{&lt;br /&gt;perror("OPENING SECOND FIFO\n ");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//SERVER DATA INTERFACE MODULE STARTS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;printf("pid is %u\n",getpid());&lt;br /&gt;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;read(ff1,&amp;ch,sizeof(char));&lt;br /&gt;&lt;br /&gt;//ENCRYPTION PART STARTS&lt;br /&gt;// ch=ch ^ 'a' ;&lt;br /&gt;//ENCRYPTION PART ENDS&lt;br /&gt;n=1;&lt;br /&gt;write(sock2,&amp;n,sizeof(int));&lt;br /&gt;&lt;br /&gt;if(ch==0)&lt;br /&gt;{&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sleep(1);&lt;br /&gt;write(ff2,&amp;ch,sizeof(char));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//SERVER DATA INTERFACE MODULE ENDS.&lt;br /&gt;&lt;br /&gt;close(ff1);&lt;br /&gt;close(ff2);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;write(fd[1],&amp;j,sizeof(int));&lt;br /&gt;write(fd[1],&amp;k,sizeof(int));&lt;br /&gt;// write(fd[1],&amp;z,sizeof(int));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;shutdown(sock2,SHUT_RDWR);&lt;br /&gt;&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;shutdown(sock,SHUT_RDWR);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*CLIENT PROGRAM*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include&lt;br /&gt;#include &lt;br /&gt;&lt;br /&gt;struct sockaddr_in add;&lt;br /&gt;&lt;br /&gt;void onerror(char *);&lt;br /&gt;&lt;br /&gt;int sd,i,n;&lt;br /&gt;&lt;br /&gt;int fd1, fd2;&lt;br /&gt;int ff1,ff2,z;&lt;br /&gt;&lt;br /&gt;char *j;&lt;br /&gt;char ch='a';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void sigint_handler()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;i=0;&lt;br /&gt;write(ff1,&amp;i,sizeof(int));&lt;br /&gt;&lt;br /&gt;close(fd1);&lt;br /&gt;close(fd2);&lt;br /&gt;&lt;br /&gt;close(ff1);&lt;br /&gt;close(ff2);&lt;br /&gt;&lt;br /&gt;unlink(j);&lt;br /&gt;&lt;br /&gt;shutdown(sd,SHUT_RDWR);&lt;br /&gt;&lt;br /&gt;printf("\nChild process terminated because of SIGINT\n");&lt;br /&gt;&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void sigpipe_handler()&lt;br /&gt;{&lt;br /&gt;printf("\nPIPE BROKEN\n");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;int bin,tmp,i=0,jk;&lt;br /&gt;&lt;br /&gt;char f1n[3],f2n[3];&lt;br /&gt;&lt;br /&gt;char s[10], *k=".";&lt;br /&gt;&lt;br /&gt;//Signal Mechanisms for ctrl+c i.e SIGINT&lt;br /&gt;&lt;br /&gt;signal(SIGINT,sigint_handler);&lt;br /&gt;&lt;br /&gt;//Signal Mechanisms for broken pipe i.e SIGPIPE&lt;br /&gt;&lt;br /&gt;signal(SIGPIPE,sigpipe_handler);&lt;br /&gt;&lt;br /&gt;//Signal Mechanisms for ctrl+\ i.e SIGQUIT&lt;br /&gt;&lt;br /&gt;signal(SIGQUIT,sigint_handler);&lt;br /&gt;&lt;br /&gt;//Checking for number of input arguments provided during runtime.&lt;br /&gt;&lt;br /&gt;if(argc&lt;3)&lt;br /&gt;{&lt;br /&gt;printf("No Sufficient arguments supplied \n");&lt;br /&gt;printf("Please provide full path for the file\n");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//CREATING CLIENT SOCKET&lt;br /&gt;&lt;br /&gt;sd=socket(AF_INET,SOCK_STREAM,0);&lt;br /&gt;if(sd&lt;0)&lt;br /&gt;{&lt;br /&gt;perror("Client Socket Creation Error\n");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;add.sin_port=htons(4500);&lt;br /&gt;add.sin_addr.s_addr=inet_addr("127.0.0.1");&lt;br /&gt;add.sin_family=AF_INET;&lt;br /&gt;&lt;br /&gt;//CONNECTING CLIENT SOCKET&lt;br /&gt;if(connect(sd,(struct sockaddr *)&amp;add,sizeof(add))&lt;0)&lt;br /&gt;{&lt;br /&gt;perror("Connection Error\n");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;for(i=0;i&lt;3;i++)&lt;br /&gt;{&lt;br /&gt;f1n[i]='\0';&lt;br /&gt;f2n[i]='\0';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//READING FIFO NAMES FROM SERVER THROUGH WHICH COMMUNICATION PROCEEDS IN FUTURE.&lt;br /&gt;&lt;br /&gt;if(read(sd,f1n,2)&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("FIFO1 Error\n");&lt;br /&gt;}&lt;br /&gt;if(read(sd,f2n,2)&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("FIFO2 Error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;printf("FIFO1 is %s\n",f1n);&lt;br /&gt;printf("FIFO2 is %s\n",f2n);&lt;br /&gt;&lt;br /&gt;//OPENING SENDER FIFO THROUGH WHICH DATA IS SENT TO SERVER&lt;br /&gt;&lt;br /&gt;ff1=open(f1n,O_RDWR);&lt;br /&gt;if(ff1==-1)&lt;br /&gt;{&lt;br /&gt;onerror("FIFO1 opening ERROR");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//OPENING RECEIVER FIFO THROUGH WHICH CLIENT RECEIVES ENCRYPTED DATA&lt;br /&gt;&lt;br /&gt;ff2=open(f2n,O_RDWR);&lt;br /&gt;if(ff2==-1)&lt;br /&gt;{&lt;br /&gt;onerror("FIFO2 opening ERROR\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//OPENING THE SOURCE FILE WHICH CONTAINS DATA TO BE ENCRYPTED&lt;br /&gt;&lt;br /&gt;fd1=open(argv[1],O_RDONLY);&lt;br /&gt;if(fd1&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("Input File doesn't Exist\n");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Mechanism to produce output filename as .&lt;br /&gt;&lt;br /&gt;i=getpid();&lt;br /&gt;z=strlen(argv[2]);&lt;br /&gt;&lt;br /&gt;j=(char *)malloc(z);&lt;br /&gt;strcpy(j,argv[2]);&lt;br /&gt;&lt;br /&gt;sprintf(s,"%d",i);&lt;br /&gt;strcat(j,k);&lt;br /&gt;strcat(j,s);&lt;br /&gt;&lt;br /&gt;//j contains output file name&lt;br /&gt;&lt;br /&gt;//OPENING OUTPUT FILE INTO WHICH ENCRYPTED DATA IS STORED.&lt;br /&gt;&lt;br /&gt;fd2=open(j,O_WRONLY|O_CREAT,0666);&lt;br /&gt;if(fd2&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("Opening Encryption File Error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// printf("\nSTART\n");&lt;br /&gt;&lt;br /&gt;z=read(fd1,&amp;ch,sizeof(char));&lt;br /&gt;if(z==-1)&lt;br /&gt;{&lt;br /&gt;onerror("Read from Input file Error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(z==0)&lt;br /&gt;{&lt;br /&gt;write(ff1,&amp;z,sizeof(int));&lt;br /&gt;break;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;else if(write(ff1,&amp;ch,sizeof(char))&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("Write into FIFO Error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// printf("\nMIDDLE\n");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(read(sd,&amp;n,sizeof(int))&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("\nRead from Socket Error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(n!=0)&lt;br /&gt;{&lt;br /&gt;// printf("\nInside If\n");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(read(ff2,&amp;ch,sizeof(char))&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("Read from FIFO Error\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(write(fd2,&amp;ch,sizeof(char))&lt;0)&lt;br /&gt;{&lt;br /&gt;onerror("Write into Encrypted File Error\n");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;printf("\nInside else\n");&lt;br /&gt;close(fd1);&lt;br /&gt;close(fd2);&lt;br /&gt;&lt;br /&gt;close(ff1);&lt;br /&gt;close(ff2);&lt;br /&gt;&lt;br /&gt;unlink(j);&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// printf("\nEND\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;close(fd1);&lt;br /&gt;close(fd2);&lt;br /&gt;&lt;br /&gt;close(ff1);&lt;br /&gt;close(ff2);&lt;br /&gt;&lt;br /&gt;shutdown(sd,SHUT_RDWR);&lt;br /&gt;&lt;br /&gt;printf("\n\nSocket connection with Server closed Successfully\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void onerror(char *msg)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;printf("\nERROR!! %s\n",msg);&lt;br /&gt;&lt;br /&gt;shutdown(sd,SHUT_RDWR);&lt;br /&gt;printf("\nSocket Connection Closed Abruptly\n");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1974455674340917444-3573513815673906481?l=linux-spawn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-spawn.blogspot.com/feeds/3573513815673906481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-spawn.blogspot.com/2009/08/example-for-multi-processing-in-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/3573513815673906481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1974455674340917444/posts/default/3573513815673906481'/><link rel='alternate' type='text/html' href='http://linux-spawn.blogspot.com/2009/08/example-for-multi-processing-in-linux.html' title='example for multi processing in linux'/><author><name>chaitu</name><uri>http://www.blogger.com/profile/08457561067684111350</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
