NETWORK PROGRAMMING LAB
NETWORK PROGRAMMING LAB
Exeperiment1:
AIM: Implement the data link layer framing methods such as character stuffing and bit stuffing.
CHARACTER STUFFINIG
DESCRIPTION:
The first framing method is used in the header to specify the number of characters in frame.
One way to solve this is to have the senders data link layer, insert an ASCII DLE char just
before each accidental flag bit character in data.
FOR EXAMPLE:
‘AB’
Data after being character stuffing by data link layer DLE STX A DLE ETX.
i.e., AB \0
BIT STUFFING:
DESCRIPTION:
Starting and ending flags with bit stuffing is one of the framing methods to specify the number
of characters or bits in a frame.
Each frame in this techniques begins and ends with a special bit pattern 01111110 called a
flag byte.
Whenever the sender’s data link layer encodes five consecutive ones in the data, it automatically stuffs
a 0 bit into the outgoing bit stream.
FOR EXAMPLE:
Original data
011011111111111111110010
01101111101111101111100010
ACOE NETWORK PROGRAMMING LAB CSE
2
Stuffed Bits
011011111111111111110010
#include<stdio.h>
#include<conio.h>
void ins(char,int);
void del(int);
char fr[50];
main()
int i,cnt=0;
clrscr();
gets(fr);
for(i=0;i<strlen(fr);i++)
if(fr[i]!='0'&&fr[i]!='1')
getch();
exit(0);
ACOE NETWORK PROGRAMMING LAB CSE
3
for(i=0;i<strlen(fr);i++)
if(cnt==5)
cnt=0;
ins('0',i);
if(fr[i]=='1'){cnt+=1;}else{cnt=0;}
getch();
/*Destuffing of aframe*/
cnt=0;
for(i=0;i<strlen(fr);i++)
if(cnt==5)
cnt=0;
del(i);
if(fr[i]=='1'){cnt+=1;}else{cnt=0;}
}
ACOE NETWORK PROGRAMMING LAB CSE
4
getch();
return 0;
char dup[50];
int i;
strcpy(dup,fr);
fr[p]=in;
for(i=p+1;i<strlen(fr)+1;i++)
fr[i]=dup[i-1];
void del(int q)
int i;
for(i=q;i<strlen(fr);i++)
fr[i]=fr[i+1];
OUTPUT:
#include<stdio.h>
#include<conio.h>
void ins(char,int);
void del(int,int);
char fr[50];
main() {
int i,cnt=0,ch;
clrscr();
gets(fr);
/*Charecter Stuffing*/
ins('s',0);
ins('e',5);
//printf("%s",fr);
for(i=0;i<strlen(fr);i++)
if(fr[i]=='d'&&fr[i+1]=='l'&&fr[i+2]=='e'&&i!=3&&i!=strlen(fr)-3)
ins('m',i+3);i+=6;
/*Destuffing*/
cnt=0;
del(0,6);
del(strlen(fr)-6,6);
for(i=0;i<strlen(fr);i++) {
if(fr[i]=='d'&&fr[i+1]=='l'&&fr[i+2]=='e')
cnt+=1;
if(cnt==1)
{ del(i,3);}
}else
{cnt=0;}
return 0;
char dup[50];
int i;
ACOE NETWORK PROGRAMMING LAB CSE
7
strcpy(dup,fr);
if(in=='s')
fr[p]='s';
fr[p+1]='t';
fr[p+2]='x';
fr[p+3]='d';
fr[p+4]='l';
fr[p+5]='e';
for(i=p+6;i<strlen(fr)+6;i++) {
fr[i]=dup[i-6];
if(in=='e')
strcat(fr,"etxdle");return;
if(in=='m')
fr[p]='d';
fr[p+1]='l';
fr[p+2]='e';
for(i=p+3;i<strlen(fr)+3;i++)
fr[i]=dup[i-3];
ACOE NETWORK PROGRAMMING LAB CSE
8
int i;
for(i=q;i<strlen(fr);i++)
fr[i]=fr[i+n];
OUTPUT:
Exeperiment2:
AIM: To write a program for implementing on a data set characters the three CRC polynomials – CSR12,
CRC16 and CRC CCIP
Description: Calculation of Polynomial Code (CRC) Checksum
1. For degree of generating polynomial G(x) = r , append r zero bits to low-order of frame. The
frame now has m+r bits.
2. Divide the bit string corresponding to G(X) into the bit string xrM(x) mod(2)
3. Subtract the remainder R(x) from the bit string xrM(x) mod(2)
Frame: 1 1 0 1 0 1 1 0 1 1 Generator: 1 0 0 1 1 G(X) = X4 + X + 1
Message after appending four 0’s: 1 1 0 1 0 1 1 0 1 1 0 0 0 0
Remainder: 1110 Transmitted Frame: 1 1 0 1 0 1 1 0 1 1 1 1 1 0
Common CRC Generator Polynomials
tlen=frl+genl-1;
for(i=frl;i<tlen;i++)
{
dupfr[i]=0;
}
remainder(dupfr);
for(i=0;i<frl;i++)
{
ACOE NETWORK PROGRAMMING LAB CSE
10
recfr[i]=fr[i];
}
for(i=frl,j=1;j<genl;i++,j++) {
recfr[i]=rem[j];
}
remainder(recfr);
flag=0;
for(i=0;i<4;i++) {
if(rem[i]!=0)
flag++;
}
if(flag==0) {
printf("frame received correctly");
}
Else {
printf("the received frame is wrong");
}
getch();
}
remainder(int fr[]) {
int k,k1,i,j;
for(k=0;k<frl;k++) {
if(fr[k]==1)
{
k1=k;
for(i=0,j=k;i<genl;i++,j++) {
rem[i]=fr[j]^gen[i];
}
for(i=0;i<genl;i++) {
fr[k1]=rem[i];
k1++;
}
}
}
INPUT:
enter frame :
11111111
enter generator :
1101
OUTPUT:
frame received correctly
Exeperiment3:
AIM: Implement Dijkstra’s algorithm to compute the Shortest path through graph.
DESCRIPTION: Dijkstra’s algorithm solves the simple source shortest paths problem on a
weighted, directed graph. G=(V,E) for the case in which all weights are non negative.The algorithm
repeatedly selects the vertex v belong s to v-s with the minimum shortest path estimate add
#include<stdio.h>
#include<string.h>
main()
int n,ds[30][30],s,d,pr[30],ln[30],st[30],pt[30],i,j,u,mn=10000;
clrscr();
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&ds[i][j]);
st[i]=0;
ln[i]=10000;
pr[i]=-1;
scanf("%d %d",&s,&d);
ln[u]=0;
pr[u]=-1;
st[u]=2;
do {
for(i=0;i<n;i++) {
st[i]=1;
if((ln[u]+ds[u][i])<ln[i]) {
pr[i]=u;
ln[i]=ln[u]+ds[u][i];
mn=10000;
for(i=0;i<n;i++)
mn=ln[i];
u=i;
}while(u!=d);
i=0;
ACOE NETWORK PROGRAMMING LAB CSE
13
u=d;
do {
pt[i]=u;
i++;
u=pr[u];
}while(u>=0);
pt[i]='\0';
s++;
d++;
printf("\npath is ");
for(u=i-1;u>=0;u--)
printf("\t %d ",(pt[u]+1));
getch();
OUTPUT:
Exeperiment4:
Take an example subnet graph with weights indicating delay between nodes. Now obtain Routing table at
each node using distance vector routing algorithm.
DESCRIPTION:
In distance vector routing, each router periodically shares its knowledge about the entire internet with
its neighbors.
The three keys to understanding how this algorithm works are as follows:
Every router keeps a routing table that has one entry for each destination network which the router aware.
#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
char c1[]={'A','I','H','K','\0'};
char c2[]={'A','B','C','D','E','F','G','H','I','J','K','L'};
int doj[]={8,10,12,6};
int i,j,min,delay[5][12],res,k=0,l=0,pre[5];
clrscr();
for(i=0;i<4;i++)
for(j=0;j<12;j++)
scanf("%d",&delay[i][j]);
min=1000;
for(j=0;j<12;j++)
for(i=0;i<4;i++)
res=delay[i][j]+doj[i];
if(res<min)
min=res;
k=i;
delay[4][j]=min;
pre[l++]=k;
min=1000;
clrscr();
for(i=0;i<12;i++)
if(i==9)
delay[4][j]=0;
if(i!=9)
else
getch();}
Exeperim
ent5:
AIM: Take an example subnet of hosts, Obtain broadcast tree for it.
DESCRIPTION:
Krushkers algorithm is used to obtain the broadcast tree from the given subnet.
This algorithm constructs a minimal spanning tree for a connected weighted graph G.
FOR EXAMPLE:
V1 16 V2
19 21 11 6 5
33 V6 14 V3
10
V5 18 V4
EDGE COST
V2-V3 5
V2-V4 6
V4-V3 10
V2-V6 11
V4-V6 14
V2-V1 16
V4-V5 18
V5-V1 19
V1-V6 21
V5-V6 23
V2
V3
V2
6 5
V4
V3
ACOE NETWORK PROGRAMMING LAB CSE
20
V2
11
6 5
V6 V4 V3
V2
V1 16 11 6 5
V5 18 V6 V4 V3
#include<stdio.h>
struct ed {
int v1,v2,w;
edj[20],temp;
main() {
int i,j,n=0,s,d,par[20],s1,d1;
clrscr();
scanf("%d",&n);
for(i=0;i<n;i++) {
ACOE NETWORK PROGRAMMING LAB CSE
21
scanf("%d%d%d",&edj[i].v1,&edj[i].v2,&edj[i].w);
par[i]=0;
for(i=0;i<n;i++) {
for(j=0;j<=i;j++)
if(edj[j].w>edj[i].w) {
temp=edj[i];
edj[i]=edj[j];
edj[j]=temp;
for(i=0;i<n;i++)
for(i=0;i<n;i++) {
s=edj[i].v1;
d=edj[i].v2;
s1=s;
d1=d;
while(par[s1]>0)
s1=par[s1];
while(par[d1]>0)
d1=par[d1];
if(s1!=d1) {
ACOE NETWORK PROGRAMMING LAB CSE
22
par[d]=s;
printf("\n%d\t%d\t%d\n",s,d,edj[i].w);
} }
getch();
OUTPUT:
Exeperiment6:
Program :#include<std
io.h>#include<stdlib.h>
#include<errno.h>#incl
ude<netdb.h>#include<
sys/
types.h>#include<sys/
socket.h>#include<neti
net/in.h>
intmain(intargc,char*argv[1])
{
struct hostent *hen;if(argc!=2) {
fprintf(stderr,"Enterthehostname\
n");exit(1);
}
hen=gethostbyname(argv[1]);if(hen==
NULL)
{
fprintf(stderr,"Hostnotfound\n");
}
printf("Hostnameis%s\n",hen->h_name);
printf("IPaddressis%s\n",inet_ntoa(*((structin_addr*)hen->h_addr)));
}
OUTPUT
Thus the above program udp performance using domain name server was executed
successfully.
Outcome:
To understand theDNS client server for resolving the host name.
Exeperiment7:
Filename: UDPServer.c
// Server side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
Filename: UDPClient.c
// Client side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
if(argc != 2){
exit(0);
int sockfd;
char buffer[1024];
socklen_t addr_size;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
}Output :
cc server.c
$ ./a.out 1234
Client : Hello from client
Hello message sent.
Cc client.c
$ ./a.out 1234
Hello message sent.
Server : Hello from server
Exeperiment8:
AIM:To implement programs using raw sockets (like packet capturing and filtering).
Program:
#include<unistd.h>
#include<stdio.h>
#include<sys/
socket.h>#include<neti
net/ip.h>
#include<netinet/tcp.h>
//Packetlength
#definePCKT_LEN8192
//Maycreateseparateheaderfile(.h)forall
//headers'structures
// IP header's
structurestructipheade
r{
unsignedchariph_ihl:5,/*Little-endian*/
iph_ver:4;
unsigned chariph_tos;unsignedshortintiph_len;unsignedshortintiph_ident;unsigned
chariph_flags;unsignedshortintiph_offset;unsigned
chariph_ttl;unsignedchariph_protocol;unsignedshortint
iph_chksum;unsignedintiph_sourceip;unsignedintiph_destip;
};
/*StructureofaTCPheader
*/structtcpheader{
unsignedshortinttcph_srcport;un
signed short int
tcph_destport;unsignedinttcph_s
eqnum;unsignedint
ACOE NETWORK PROGRAMMING LAB CSE
28
tcph_acknum;
unsignedchartcph_reserved:4,tcph_offset:4;
//
unsignedchartcph_flags;un
signedint
tcp_res1:4,/*little-endian*/
tcph_hlen:4, /*lengthoftcpheaderin32-bitwords*/
tcph_fin:1,/*Finishflag"fin"*/
tcph_syn:1, /*Synchronizesequencenumbersto
startaconnection*/tcph_rst:1,/*Resetflag*/
tcph_psh:1,/*Push,sendsdatatotheapplication*/
tcph_ack:1,
/*acknowledge*/tcph_urg:1, /
*urgent pointer*/tcph_res2:2;
unsignedshort inttcph_win;unsignedshortinttcph_chksum;unsignedshortinttcph_urgptr;
};
//Simplechecksumfunction,mayuseotherssuchasCyclicRedundancyCheck,CRC
unsignedshortcsum(unsignedshort*buf,intlen)
{
unsignedlong
sum;for(sum=0; len>0;
len--)sum+=*buf++;
sum=(sum>>16)+
(sum&0xffff);sum+=(sum>>16);
return(unsignedshort)(~sum);
}
intmain(intargc,char*argv[])
{
intsd;
//
Nodata,justdatagramchar
buffer[PCKT_LEN];
// Thesizeoftheheaders
structipheader *ip =(struct ipheader*) buffer;structtcpheader *tcp=(structtcpheader*)
(buffer+sizeof(structipheader));
structsockaddr_insin,din;i
ntone= 1;
constint*val=
&one;memset(buffer,0,PCKT_
LEN);
if(argc!=5)
{
printf("-Invalidparameters!!!\n");
printf("- Usage:%s<sourcehostname/IP><sourceport>
<target hostname/IP><target port>\n",
argv[0]);exit(-1);
}
sd=socket(PF_INET,SOCK_RAW, IPPROTO_TCP);
if(sd <0)
{
perror("socket()
error");exit(-1);
}
else
printf("socket()-SOCK_RAWand tcp protocolisOK.\n");
//Thesourceisredundant, maybeusedlater ifneeded
//
Addressfamilysin.sin_famil
y=
AF_INET;din.sin_family=
AF_INET;
//Sourceport,canbeany,modifyasneededsin.sin_port =
ACOE NETWORK PROGRAMMING LAB CSE
30
htons(atoi(argv[2]));din.sin_port=htons(atoi(argv[4]));
//SourceIP,canbeany,modifyas
neededsin.sin_addr.s_addr=inet_addr(argv[1]);din.sin_addr.s_addr=inet_addr(argv[3]);
// IP
structureip-
>iph_ihl=5;
ip->iph_ver =4;
ip->iph_tos= 16;
ip->iph_len=sizeof(structipheader)+sizeof(structtcpheader);
ip->iph_ident =
htons(54321);ip->iph_offset=
0;
ip->iph_ttl= 64;
ip->iph_protocol= 6;//TCP
ip->iph_chksum= 0;//Done bykernel
//
SourceIP,modifyasneeded,spoofed,weacceptthroughcomm
andlineargument
ip->iph_sourceip=inet_addr(argv[1]);
//DestinationIP, modifyasneeded, buthereweacceptthroughcommandlineargument
ip->iph_destip= inet_addr(argv[3]);
//TheTCPstructure.Thesourceport,spoofed,weacceptthroughthecommandline
tcp->tcph_srcport=htons(atoi(argv[2]));
//Thedestinationport, weacceptthroughcommandlinetcp->tcph_destport=htons(atoi(argv[4]));
tcp->tcph_seqnum=htonl(1);tcp->tcph_acknum=0;
tcp->tcph_offset=5;
tcp->tcph_syn= 1;
tcp->tcph_ack= 0;
tcp->tcph_win=htons(32767);
tcp->tcph_chksum = 0; // Done by kerneltcp->tcph_urgptr=0; //IPchecksumcalculation
RESULT:
Thus the Above programs using raw sockets TCP \IP (like packet capturing and filtering) was
executed successfully.
Outcome:
To understand packet filtering and capturing using raw sockets.
Exeperiment9:
PROGRAM:
#include<stdio.h>
#include<conio.h>
void main()
char sender[50],receiver[50];
int i,winsize;
clrscr();
scanf("%d",&winsize);
Output:
ACK:4
Exeperiment 10:
Program:
#include<sys/types.h>
#include<sys/socket.h>
#include<net/if_arp.h>
#include<sys/ioctl.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<math.h>
#include<complex.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<netinet/if_ether.h>
#include<net/ethernet.h>
#include<stdlib.h>
int sd;
sin.sin_family=AF_INET;
if(inet_aton(argv[1],&sin.sin_addr)==0)
exit(0);
memcpy(&myarp.arp_pa,&sin,sizeof(myarp.arp_pa));
strcpy(myarp.arp_dev,"echo");
sd=socket(AF_INET,SOCK_DGRAM,0);
if(ioctl(sd,SIOCGARP,&myarp)==1)
exit(0);
ptr=&myarp.arp_pa.sa_data[0];
printf("%x:%x:%x:%x:%x:%x\n",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
printf("\n\t\t\t\t%x:%x:%x:%x:%x:%x\n", myarp.arp_ha.sa_data[0],
myarp.arp_ha.sa_data[1], myarp.arp_ha.sa_data[2],
return 0;
Output:
Exeperiment 11:
AIM:TosimulatetheImplementingRoutingProtocolsusingbordergatewayprotocol(BGP)
Program:
#include<stdio.h>
main()
{
int i,n,j,k,a[10][10],b[10][10];
printf("ENTER THE NO OF NODES");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("ENTER THE DISTANCE BETWEEN HOSTS %d,%d :",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
printf("THE GIVEN INPUT\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]>a[i][k]+a[k][j])
ACOE NETWORK PROGRAMMING LAB CSE
40
{
a[i][j]=a[i][k]+a[k][j];
}
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=a[i][j];
if(i==j)
b[i][j]=0;
}
}
printf("OUTPUT MATRIX \n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",b[i][j]);
}
printf("\n");
}
}
OUTPUT:
[20mh1a4917@localhost]$cc protocol.c
[[20mh1a4917@localhost s]$./a.out
Enter the no of nodes: 2
ENTER THE DISTANCE BETWEEN HOSTS 1 1:1
ENTER THE DISTANCE BETWEEN HOSTS 1 2:2
Exeperiment 12:
AIM: To simulate the OPEN SHORTEST PATH FIRST outing protocol based on the cost assign
edge to the path.
PROGRAM:
#include<stdio.h>
#include<conio.h>
inta[5][5],n,i,j;
void main() {
voidgetdata();
void shortest();
void display();
clrscr();
printf("\n\nPROGRAMTOFINDSHORTEST PATHBETWEENTWONODES\
n");
getdata();
shortest();
display();
getch();
}
void getdata()
{
clrscr();
printf("\n\nENTERTHENUMBEROFHOSTINTHEGRAPH\n");
scanf("%d",&n);
printf("\n\nIFTHEREISNODIRECTPATH\n");
printf("\n\nASSIGNTHEHIGHESTDISTANCE VALUE1000\n");
for(i=0;i<n;i++)
{a[i]
[j]=0;
for(j=0;j<n;j++)
{
if(i!=j)
{
printf("\n\nENTERTHEDISTANCEBETWENN(%d,
%d):",i+1,j+1);
scanf("%d",&a[i]
[j]);if(a[i][j]==0)
a[i][j]=1000;
}
}}}
void shortest() {
inti,j,k;for(k=0;k<n;k++)for(i=0;i<n;i++)for(j=0;j<n;j++) {
if(a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[i][k]+a[k][j];
}
}
void display()
{
inti,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)if(i!=j)
{
printf("\nSHORTEST PATHIS:(%d,%d)--%d\n",i+1,j+1,a[i][j]);
}
getch();
}
OUTPUT:
ThustheaboveprogramtosimulatetheImplementingRoutingProtocolsusingopenshortestpathfirst(
OSPF)was executedandsuccessfully.
ACOE NETWORK PROGRAMMING LAB CSE
44
Outcome:To understandtheimplementationofOPENSHORTESTPATHFIRSTforfindingthe
shortestpathbetweensourceanddestination.
Exeperiment13:
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
fd_set rfds;
struct timeval tv;
int retval;
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n");
else
printf("No data within five seconds.\n");
return 0;
}
Exeperiment 14
rceserver.c
#include<string.h>
#include<stdio.h>
#include<netinet/in.h>
#include<fcntl.h>
int main()
char sendline[400],recvline[400];
int servsocket,connfd,fd,clilen;
servsocket=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(2536);
listen(servsocket,1);
while(1)
clilen=sizeof(cliaddr);
connfd=accept(servsocket,(struct sockaddr*)&cliaddr,&clilen);
read(connfd,recvline,400);
strcat(recvline,">file.txt");
ACOE NETWORK PROGRAMMING LAB CSE
46
system(recvline);
fd=open("file.txt",O_RDONLY,666);
read(fd,sendline,400);
write(connfd,sendline,400);
rceclient.c
#include<string.h>
#include<stdio.h>
#include<netinet/in.h>
int main()
char sendline[400],recvline[400];
int clisocket;
clisocket=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(2536);
connect(clisocket,(struct sockaddr*)&servaddr,sizeof(servaddr));
scanf("%s",sendline);
write(clisocket,sendline,400);
ACOE NETWORK PROGRAMMING LAB CSE
47
read(clisocket,recvline,400);
Server
Client
date