|
May
06
|
停止等待机制是数据传输的最基本机制. 发送方发送一个带有序号的包给对方, 然后在收到确认之后才发出下一个. 停止等待机制的实现简单, 在TFTP协议中使用. 但是它的传输时延与网络时延成正比, 因为当数据在线路上传输的时候, 发送方和接收方什么也不做, 只是等待. 如果需要高的吞吐率, 就应该使用滑动窗口机制(TCP协议使用)等.
正如前面所说的, 停止等待机制容易实现, 下面给出使用UDP实现停止等待机制的代码:
// Send data and wait for an ACK. Return bytes sent.
// If error occurs, return -1;
int send_packet(int sock, struct Packet *packet, int size){
struct tftpx_packet rcv_packet;
int time_wait_ack = 0;
int rxmt = 0;
int r_size = 0;
for(rxmt = 0; rxmt < PKT_MAX_RXMT; rxmt ++){
if(send(sock, packet, size, 0) != size){
return -1;
}
for(time_wait_ack = 0; time_wait_ack < PKT_RCV_TIMEOUT; time_wait_ack += 5000){
r_size = recv(sock, &rcv_packet, sizeof(rcv_packet), MSG_DONTWAIT);
if(r_size > 4 && rcv_packet.cmd == htons(CMD_ACK) && rcv_packet.seq== packet->seq){
// Valid ACK
goto send_done;
}
usleep(5000);
}
// Retransmission
}
if(rxmt == PKT_MAX_RXMT){
// send timeout
printf("Sent packet exceeded PKT_MAX_RXMT.\n");
return -1;
}
send_done:
return size;
}
Related posts:
Leave a Reply

Recent Comments