c客户端和服务器之间的编程同步

时间:2017-11-11 04:08:27

标签: c algorithm networking protocols synchronous

我被要求在c中实现停止和等待文件传输程序。我是个菜鸟,所以请耐心等待。第一部分是客户端向服务器发送文件名。如果客户端超时,则表示服务器从未获取文件名,重新发送文件名。但是,如果服务器确实获得了它,并且该文件是否存在的状态会丢失并返回到服务器,则客户端会超时并重新发送文件名。与此同时,服务器认为一切都很好并继续开始发送文件内容。这就是我被困住的地方。我不想发回另一个ack(基本上我的'或'e'是服务器收到它的确认),因为那时我被另一个可能的文件丢失困住了。我试图找出如何防止服务器继续前进,直到客户端收到该状态。我理解停止和等待纸张的算法,但不知道如何以编程方式实现。有线索吗?谢谢你的帮助。

这是客户的一部分:

 FD_ZERO(&readfds);
  FD_SET(s, &readfds);
  //packetErrorSend randomly drops packets
  packetErrorSend(s, file, strlen(file)+1, 0);
  while(rv == 0)
  {
    tv.tv_sec = 4;
    rv = select(s+1, &readfds, NULL, NULL, &tv);

    if (rv == -1) {
      perror("select"); // error occurred in select()
    } else if (rv == 0) {
      printf("Timeout occurred!  No data after 5 seconds.\n");
      packetErrorSend(s, file, strlen(file), 0);
    } else {
      status = recvx(s,buf,1);
    }
  }
//...check value of buf[0] to see if the file exists, if an 's' then start receiving file, if an 'e' print error and close

服务器部分:

  if ((bytes_transferred = recv(new_s,file,sizeof(file),0)) > 0)
    {
      fd = open(file,O_RDONLY);
      if(fd < 0)
      {
        perror("open");
        status[0] = 'e';
        packetErrorSend(new_s,status,1,0);
        close(new_s);
        exit(0);
      }
      status[0] = 's';
      packetErrorSend(new_s,status,1,0);

//...start sending file...

0 个答案:

没有答案
相关问题