Wednesday, 13 August 2014

socket programs



struct sockaddr_in
{ /* structure to hold an address
U_char sin_len; /* total length
U_short sin_family; /* type of address
U_short sin_port; /*protocol port number
Struct in_addr sin_addr; /* IP Address
}
struct sockaddr_in obj
obj.sin_family=AF_INET;
obj.sin_port=portnumber
obj.sin_addr.s_addr=inet_addr(“IP Addrress”)/ INADDR_ANY;


INADDR_ANY- Adress which allows the socket to receive packets from any of the machines IP address.
Inet_addr- takes an ASCII string that contains a dotted decimal address snd returns equivalent IP address in binary


socket(int socket_family, int socket_type, int protocol); Protocol family, protocol, number
example: sock=socket(AF_INET,SOCK_STREAM,0);
bind(int socket, const struct sockaddr *address,socklen_t address_len);
ret=bind(sock,(struct sockaddr*)&obj,sizeof(obj)); //Binding socket
accept(int socket, const struct sockaddr *address,socklen_t address_len);
newsock=accept(sock,(struct sockaddr*)&obj,&z); //Accepting the client


listen(socket, int backlog); backlog means no of clients it connect to.
ret=listen(sock,1); //listening for 1 client connection


connect(int socket, const struct sockaddr *address,socklen_t address_len);
ret=connect(sock,(struct sockaddr*)&obj,sizeof(obj)); //Requesting to Connect with server
recv(newsock,&n,sizeof(n),0);
ret=recv(sock,&f,sizeof(f),0);
send(newsock,&n,sizeof(n),0);
ret=send(sock,&f,sizeof(f),0);


                 UDP SOCKET


  Client                             Server

                                                             
                                                                   bind
    sendto()                                       recvfrom()


    recvfrom()                                   sendto()


sample programs

1. String Reverse

Server program
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main(int argc,char* argv[])
{
        int sock,newsock,i;
    int count=0;
        struct sockaddr_in obj;
        int z,ret,n,j=0;
        char msg1[50],b[50];
        obj.sin_family=AF_INET;
        obj.sin_port=atoi(argv[1]);
        obj.sin_addr.s_addr=INADDR_ANY;
        sock=socket(AF_INET,SOCK_STREAM,0);
        ret=bind(sock,(struct sockaddr*)&obj,sizeof(obj));
        if(ret<0)
        {
                 printf("\nBinding Failed\n");
                 close(sock);
                 exit(EXIT_FAILURE);
        }
        ret=listen(sock,1);
        newsock=accept(sock,(struct sockaddr*)&obj,&z);
                 if(newsock<0)
                 {
                    printf("\nAccept Failed\n");
                    close(sock);
                    exit(EXIT_FAILURE);
                 }
                 ret=recv(newsock,&msg1,sizeof(msg1),0);
           n=strlen(msg1);
      for(i=n-1;i>=0;i--)      
    {
b[j++]=msg1[i];
   
    }
b[j]='\0';
printf("reverse of string is\n");
puts(b);
       
           //printf("reverse is %s",msg2);
            close(sock); }
Client program (String Reverse)

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
main(int argc,char* argv[])
{
        int sock;
        struct sockaddr_in obj;
        int z,ret,n;
        char msg[50];
        obj.sin_family=AF_INET;
        obj.sin_port=atoi(argv[1]);
        obj.sin_addr.s_addr=INADDR_ANY;
        sock=socket(AF_INET,SOCK_STREAM,0);
        ret=connect(sock,(struct sockaddr*)&obj,sizeof(obj));
        if(ret<0)
        {
                 printf("\nConnection Failed\n");
                 close(sock);
                 exit(EXIT_FAILURE);
        }
        printf("\n Enter the string : ");
        gets(msg);
        ret=send(sock,&msg,sizeof(msg),0);
        close(sock); }

2. String Reverse

Server code for word count in a string

n=strlen(msg1);
        for(i=0;i<n;i++)
    {
        if(msg1[i]==' ')
        count++;
    }
printf("n is %d",n);
    printf("word count is %d",count+1);

3. File Transfer

Server code for File Transfer
 fp=fopen("sample","w");
while(recv(newsock,msg,sizeof(msg),0))
{
puts(msg);
fputs(msg,fp);
}

Client code for File Transfer

fp=fopen("clientfile.txt","r");
while(!feof(fp))
{
fgets(msg,sizeof(msg),fp);
ret=send(sock,msg,sizeof(msg),0);
}
4. ARP simulation
create a file with following data
172.16.31.5 EB:FE:AB:00:20:43
172.16.31.6 EB:FE:AB:00:20:44
172.16.31.7 EB:FE:AB:00:20:45
 
Code for retreiving mac addres for given IP
 
 #include<stdio.h>
main()
{
FILE *fp;
char ip1[25],ip[25],mac[25];
fp=fopen("ip.txt","r");
printf("Enter ip");
scanf("%s",ip1);
puts(ip1);
while(!feof(fp))
{
fscanf(fp,"%s",ip);
fscanf(fp,"%s",mac);

if(strcmp(ip1,ip)==0)
{
puts(mac);
}
}
}