08 March, 2014

CHECKSUM

CHECKSUM Receiver

#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>

struct frame
{
    char *info;
    int count;
}r;

void displayBits(char c);
int getBit(char c,int pos);
char setBit(char c,int pos);
char unsetBit(char c,int pos);

main()
{
    int fd,file,nread,nwrite,i,j;

    int n=4;    //Number of frames
   
    if((fd=open("testfile",O_RDONLY))<0)
        perror("Pipe open failed");

    if((file=open("output.txt",O_WRONLY))<0)
        perror("Output file open failed");

    printf("\nOutput..........");

    for(;;)
    {
        char ch;

        if((nread=read(fd,&ch,1))>0)
        {
            int sum,carry;

            r.info=(char *)malloc(sizeof(char)*(n+1));

            r.info[0]=ch;

            for(i=1;i<n;i++)
            {
                if(nread=read(fd,&r.info[i],1)<=0)
                    break;
            }
            printf("\nReceived %s",r.info);

            carry=0;

            for(i=8;i>=1;i--)
            {
                sum=carry;
                for(j=0;j<n;j++)
                {
                    if(getBit(r.info[j],i)==1)
                    {
                        sum++;
                    }
                }
                if((sum%2)==1)
                {
                    r.info[n]=setBit(r.info[n],i);
                }
                else
                {
                    r.info[n]=unsetBit(r.info[n],i);
                }

                switch(sum)
                {
                    case 5:
                        carry=sum-3;
                        break;   
                    case 4:
                    case 3:
                        carry=sum-2;
                        break;
                    case 2:
                    case 1:
                        carry=sum-1;
                        break;
                }
            }
       
            printf("\nAt receiver: \n");
           
            for(i=0;i<=n;i++)
            {
                if(i==n)
                    printf("\n-------Sum----\n");
               
                displayBits(r.info[i]);

                printf("\n");
            }
   
            if(carry==1)
            {
                printf("    %d\n",carry);
   
                r.info[n]=r.info[n]+1;

                displayBits(r.info[n]);

                printf("\n");
            }

            printf("-----1's Complement----\n");

            r.info[n]=~r.info[n];

            displayBits(r.info[n]);

            printf("\n");

            if(r.info[n]==0)
            {
                for(i=0;i<=n-2;i++)
                {
                    if((nwrite=write(file,&r.info[i],1))<=0)
                    perror("message write failed");
                }
            }
            else
            {
                printf("\nError detected");
            }
            free(r.info);
        }
    }
}
void displayBits(char c)
{
        int no=128,i;

        for(i=0;i<8;i++)
        {
                if((no&c)>0)
                        printf("1");
                else
                        printf("0");
                no=no>>1;
        }
}
int getBit(char c,int pos)
{
        int no=128;

        no=no>>(pos-1);

        if((c&no)>0)
                return 1;
        else
                return 0;
}
char setBit(char c,int pos)
{
        int no=128;

        no=no>>(pos-1);

        c=c|no;

        return c;
}

char unsetBit(char c,int pos)
{
        int no=128;

        no=no>>(pos-1);               
        no=~no;

        return c&no;
}





CHECKSUM Sender


#include<fcntl.h>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct frame
{
    char *info;
}s;

void displayBits(char c);
int getBit(char c,int pos);
char setBit(char c,int pos);
char unsetBit(char c,int pos);

main()
{
    int fd,file1,j,nread,nwrite;

    int n=3;    //frame size

    if((file1=open("input.txt",O_RDONLY))<0)
        perror("Input file open failed");

    if((fd=open("testfile",O_WRONLY))<0)
        perror("Pipe open failed");

    while(1)
    {
        int i;
       
        int sum,carry;

        s.info=(char *)malloc(sizeof(char)*(n+1));

        if((nread=read(file1,s.info,n))<=0)
            break;

        carry=0;
       
        for(i=8;i>=1;i--)
        {
            sum=carry;

            for(j=0;j<n;j++)
            {
                if(getBit(s.info[j],i)==1)
                {
                    sum++;
                }
            }
       
            if((sum%2)==1)
            {
                s.info[n]=setBit(s.info[n],i);
            }
            else
            {
                s.info[n]=unsetBit(s.info[n],i);
            }
           
            switch(sum)
            {
                case 4:
                case 3:
                    carry=sum-2;
                    break;
                case 2:
                case 1:
                    carry=sum-1;
                    break;
            }
           
        }
       
        printf("\nInput \n");

        for(i=0;i<=n;i++)
        {
            if(i==n)
                printf("--------Sum-------\n");
           
            displayBits(s.info[i]);
            printf("\n");
        }

        if(carry==1)
        {
            printf("        %d\n",carry);
            s.info[n]=s.info[n]+1;
   
            displayBits(s.info[n]);
            printf("\n");
        }

        printf("--1's Complement--\n");

        s.info[n]=~s.info[n];

        displayBits(s.info[n]);
        printf("\n");

        for(i=0;i<=n;i++)
        {
            if((nwrite=write(fd,&s.info[i],1))<=0)
                perror("Message write failed");
       
        }
        free(s.info);
               
    }
       
}

void displayBits(char c)
{
    int no=128,i;

    for(i=0;i<8;i++)
    {
        if((no&c)>0)
            printf("1");
        else
            printf("0");
        no=no>>1;
    }
}
int getBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    if((c&no)>0)
        return 1;
    else
        return 0;
}
char setBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    c=c|no;

    return c;
}

char unsetBit(char c,int pos)
{
    int no=128;

    no=no>>(pos-1);

    no=~no;

    return c&no;
}