Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. string Divisor="100000100110000010001110011010111",FCS,reminder1,error_frame,Frame,temp1;
  5. char data[1000],data_frame[100];
  6. int data_size,frame_send=0,current_data=0,i,temp,error=0,ack=0;
  7. double number_of_frame,data_per_frame=64;
  8.  
  9. void get_data();
  10. void transmitter();
  11. void transmission(string Frame);
  12. void frame_genarte();
  13. void receiver(string f,int e);
  14. string CRC(string Dividend);
  15.  
  16. int main(){
  17. get_data();
  18. transmitter();
  19. }
  20.  
  21. ///taking data from file
  22. void get_data(){
  23. ifstream input("input.txt");
  24. char bit='0';
  25. data_size=0;
  26. while(input>>bit){
  27. data[data_size]=bit;
  28. data_size++;
  29. }
  30. input.close();
  31. number_of_frame=ceil(data_size/data_per_frame); ///calculating number of frame
  32. }
  33.  
  34. void transmitter(){
  35. for(int j=0;j<number_of_frame;j++){
  36. cout<<endl<<"------------------------------------------------------------------"<<endl;
  37. cout<<"Packet number: "<<frame_send<<" Sequence no: "<<ack<<endl;
  38. cout<<"------------------------------------------------------------------"<<endl<<endl;
  39. frame_genarte(); ///generating frame
  40. frame_send++;
  41. }
  42. }
  43.  
  44. void frame_genarte(){
  45. //cout<<"=================================================================="<<endl;
  46. cout<<"SENDER:: Frame generating::"<<endl;
  47. if(frame_send<number_of_frame){
  48. for(i=0;i<data_per_frame;i++){
  49. data_frame[i]=data[current_data++];
  50. }
  51. }
  52. else{
  53. temp=data_size-current_data; ///for last frame
  54. for(i=0;i<temp;i++){
  55. data_frame[i]=data[current_data++];
  56. }
  57. }
  58. FCS ="";
  59. Frame="";
  60. while(FCS.size()<Divisor.size()-1){
  61. FCS.insert(0,"0");
  62. }
  63. string Frame = data_frame+FCS;///added initial FCS and data
  64. FCS=CRC(Frame);
  65. Frame=data_frame+FCS; ///final FCS added here
  66. cout<<"After adding FCS: "<<Frame<<endl;
  67. transmission(Frame);
  68.  
  69. }
  70.  
  71. void transmission(string Frame){
  72.  
  73. int r=rand()%2; ///1 error...0 no error
  74. cout<<endl<<"SENDER:: Transmitting data ==========>\t\t";
  75. if(r==1){
  76.  
  77. if(error<3){ ///maximum 3 times error will occur
  78. error++;
  79. int e=rand()%3; ///0=lost data 1=lost ack 2=data error
  80. if(e==0){ ///lost data
  81. receiver(Frame,e);
  82. }
  83. if(e==1){ ///lost ack
  84. receiver(Frame,e);
  85. }
  86. if(e==2){ ///data error
  87. int p=rand()%97;
  88. error_frame=Frame;
  89. if(error_frame[p]=='1'){
  90. error_frame[p]='0';
  91. }else{
  92. error_frame[p]='1';
  93. } ///changing one bit
  94. receiver(error_frame,e);
  95. }
  96. }
  97. else{
  98. receiver(Frame,3);
  99. }
  100. }
  101. else
  102. receiver(Frame,3);
  103. }
  104.  
  105. void receiver(string f,int e){
  106.  
  107. switch(e){
  108. case 0:
  109. cout<<"RECEIVER:: Data lost!!****************No Acknowledgement"<<endl;
  110. cout<<endl<<"SENDER:: Resending Frame "<<endl;
  111. transmission(f);
  112.  
  113. break;
  114. case 1:
  115. cout<<"\nSENDER:: Lost Acknowledgement "<<endl<<endl;
  116. cout<<"SENDER:: Resending Frame"<<endl;
  117. transmission(f);
  118. break;
  119. case 2:
  120. {
  121. ///checking error
  122. temp1=CRC(f);
  123. bool error1 = false;
  124. for(int i=0; i<temp1.size();i++){
  125. if(temp1[i]=='1')
  126. error1 = true;
  127. }
  128. if(error1){
  129. cout<<"RECEIVER:: Error in data"<<endl<<endl;
  130. }
  131. cout<<"SENDER:: Resending Frame "<<endl;
  132. transmission(f);
  133. break;
  134. }
  135.  
  136. case 3:
  137. ack=(ack==0)?1:0;
  138. cout<<"RECEIVER:: <========== ACK "<<ack<<endl<<endl;
  139. break;
  140. }
  141. }
  142.  
  143.  
  144. string CRC(string Dividend)
  145. {
  146. string Temp="",Reminder;
  147. int FCSLen = Divisor.size()-1;
  148.  
  149. for(int i=0; i<Dividend.size(); i++)
  150. {
  151. if(Temp.size()<Divisor.size())
  152. Temp.push_back(Dividend[i]);
  153.  
  154. if(Temp.size()==Divisor.size())
  155. {
  156. Reminder="";
  157. for(int i=0; i<Temp.size(); i++)
  158. if(Temp[i] == Divisor[i])
  159. Reminder.push_back('0');
  160. else
  161. Reminder.push_back('1');
  162. while(Reminder[0]=='0')
  163. Reminder.erase(0,1);
  164. Temp = Reminder;
  165. }
  166. }
  167. while(Temp.size()<FCSLen)
  168. Temp.insert(0,"0");
  169. return Temp;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement