|
停止等待机制是数据传输的最基本机制. 发送方发送一个带有序号的包给对方, 然后在收到确认之后才发出下一个. 停止等待机制的实现简单, 在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;
- }
复制代码
原来在我的网站: http://www.ideawu.net/ideablog/category8/article234.html |
|