我被要求在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...