rendered paste body#include"dccp.h"
#include<math.h>
struct ip pkt;
struct sockaddr_in host,src,destn;
int sock,len;
float pktrate=1;
int seqno=5631;
float rtt=0,sample_rtt=0;
float lossrate;
struct timeval t;
struct timezone tz;
void addressbinder()
{
host.sin_addr.s_addr=inet_addr("127.0.0.3");
destn.sin_addr.s_addr=inet_addr("127.0.0.6");
host.sin_family=destn.sin_family=AF_INET;
len=sizeof(src);
if(bind(sock,(struct sockaddr*)&host,sizeof(host))<0)
perror("bind");
}
void conncloser()
{
pkt.packet.dccphead.type=5;
pkt.packet.dccphead.seqno=++seqno;
if(sendto(sock,&pkt,sizeof(pkt),0,(struct sockaddr*)&destn,sizeof(destn))<0)
perror("sendto");
printf("\n DCCP-Close Req Packet sent with seqno %d\n",seqno);
if(recvfrom(sock,&pkt,sizeof(pkt),0,(struct sockaddr*)&src,&len)<0)
perror("recvfrom");
printf("\n DCCP-Close Packet Received \n");
printf("\n Connection Closed \n");
}
void rttcalculator()
{
long difference=0;
difference=(-pkt.packet.dccphead.optn.timestamp.tv_sec+t.tv_sec)*1000000+(-pkt.packet.dccphead.optn.timestamp.tv_usec+t.tv_usec);
float k=(float)(difference/=1000);
if(rtt==0)
rtt=difference;
else
{
rtt=(0.85*rtt)+(0.15*difference);
}
printf("\n The sample RTT is \n",difference);
printf("\n The mean RTT is \n",rtt);
}
void pktratecalculator()
{
float k=sqrtf(2*pktrate*lossrate);
float a=rtt*k;
float l=sqrtf(3*pktrate*lossrate*8);
float b=3*l*lossrate*(pow(1+(32*lossrate),2));
float c=sizeof(struct ip)/(a*b);
pktrate=(int)c;
printf("\n The pkt rate is %d \n",pktrate);
}
void conn_establish()
{
pkt.packet.dccphead.type=0;
pkt.packet.dccphead.seqno=++seqno;
pkt.packet.dccphead.optn.ccid=3;
if(gettimeofday((&t),&tz)<0)
perror("gettimeofday");
pkt.packet.dccphead.optn.timestamp=t;
if(sendto(sock,&pkt,sizeof(pkt),0,(struct sockaddr*)&destn,sizeof(destn))<0)
perror("sendto");
printf(" \n DCCP-Request Packet sent to DCCP Server addressed 127.0.0.12 \n");
printf(" \n Feature Negotiation Started \n");
printf(" \n The CCID value sent for negotiation with Server is 3 i.e.,TCP Friendly Rate Control Mechanism \n");
if(recvfrom(sock,&pkt,sizeof(pkt),0,(struct sockaddr*)&src,&len)<0)
perror("recvfrom");
if(gettimeofday((&t),&tz)<0)
perror("gettimeofday");
printf(" \n DCCP-Response Packet Received \n ");
printf(" \n Feature Negotiation Over \n");
printf(" \n The CCID Value of 3 has been accepted by both sides for any further communication \n");
rttcalculator();
}
void pkt_transmission()
{
int i;
char choice;
while(1)
{
for(i=0;i<pktrate;i++)
{
pkt.packet.dccphead.type=2;
pkt.packet.dccphead.seqno=++seqno;
if(gettimeofday((&t),&tz)<0)
perror("gettimeofday");
pkt.packet.dccphead.optn.timestamp=t;
if(sendto(sock,&pkt,sizeof(pkt),0,(struct sockaddr*)&destn,sizeof(destn))<0)
perror("sendto");
printf("\n DCCP-Data Packet sent with seqno %d\n",seqno);
}
if(recvfrom(sock,&pkt,sizeof(pkt),0,(struct sockaddr*)&src,&len)<0)
perror("recvfrom");
if(gettimeofday((&t),&tz)<0)
perror("gettimeofday");
printf("\n DCCP-Ack Packet Received with seq no %d and ack no %d \n",pkt.packet.dccphead.ackno,seqno);
lossrate=pkt.packet.dccphead.optn.lossrate;
rttcalculator();
pktratecalculator();
printf("\n Do u wanna close the connection \n");
scanf("%c",&choice);
if(choice=='y')
{
conncloser();
break;
}
}
}
int main()
{
if((sock=socket(AF_INET,SOCK_RAW,100))==-1)
perror("socket");
addressbinder();
conn_establish();
pkt_transmission();
close(sock);
return 0;
}