仅供个人笔记,不能保证正确
#include "unp.h"
extern int c_window, allow_window;
extern int RTO;
extern int *point1, *point2, *point3;
extern int record_conges;
void mult_dec( ) { /*乘法减小*/
int *tmp;
if(c_window >>= 2) {
if(c_window == 0 )
c_window = 1;
allow_window = min(c_window, allow_window);
RTO <<= 2;
for(temp = point2; temp < point3 ; temp++) {
send( /* */);
}
}
}
void slow_start( ) { /*加法增加,慢开始*/
if(c_window == record_conges/2) {
while(point1 == point2) {
/*waitack*/
}
}
else {
c_window ++;
allow_window = min(c_window, allow_window);
send(/* */);
}
}
void alarm_send( ) {
/*超时重传*/
alarm(secs);
newpack(); /*清0重传计数*/
sendagain:
send( /* */);
if(sigsetjmp( /**/ , 1)) { /*信号处理函数为 调用sigjmpbuf()*/
if(exceed_num_of_retrans() ) {
discard();
RTO <<= 2;
}
add_retrans_num(); /*增加重传计数*/
goto sendagain;
}
while(recv(/* */) == SUCCESS);
alarm(0);
cal_rtt_and_rto( ); /*根据karn算法,重新估计RTO,前提是收到为重传的包的ACK*/
}
}