LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 517|回复: 0

分享: 数据传输中的停止等待机制的实现

[复制链接]
发表于 2007-5-10 08:17:49 | 显示全部楼层 |阅读模式
停止等待机制是数据传输的最基本机制. 发送方发送一个带有序号的包给对方, 然后在收到确认之后才发出下一个. 停止等待机制的实现简单, 在TFTP协议中使用. 但是它的传输时延与网络时延成正比, 因为当数据在线路上传输的时候, 发送方和接收方什么也不做, 只是等待. 如果需要高的吞吐率, 就应该使用滑动窗口机制(TCP协议使用)等.

正如前面所说的, 停止等待机制容易实现, 下面给出使用UDP实现停止等待机制的代码:


  1. // Send data and wait for an ACK. Return bytes sent.
  2. // If error occurs, return -1;
  3. int send_packet(int sock, struct Packet *packet, int size){
  4.         struct tftpx_packet rcv_packet;
  5.         int time_wait_ack = 0;
  6.         int rxmt = 0;
  7.         int r_size = 0;
  8.        
  9.         for(rxmt = 0; rxmt < PKT_MAX_RXMT; rxmt ++){
  10.                 if(send(sock, packet, size, 0) != size){
  11.                         return -1;
  12.                 }
  13.                 for(time_wait_ack = 0; time_wait_ack < PKT_RCV_TIMEOUT; time_wait_ack += 5000){
  14.                         r_size = recv(sock, &rcv_packet, sizeof(rcv_packet), MSG_DONTWAIT);
  15.                         if(r_size > 4 && rcv_packet.cmd == htons(CMD_ACK) && rcv_packet.seq== packet->seq){
  16.                                 // Valid ACK
  17.                                 goto send_done;
  18.                         }
  19.                         usleep(5000);
  20.                 }
  21.                 // Retransmission
  22.         }
  23.         if(rxmt == PKT_MAX_RXMT){
  24.                 // send timeout
  25.                 printf("Sent packet exceeded PKT_MAX_RXMT.\n");
  26.                 return -1;
  27.         }
  28. send_done:
  29.         return size;
  30. }
复制代码

原来在我的网站: http://www.ideawu.net/ideablog/category8/article234.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表