C++ 在c+中使用UDP开发用于文件传输的RDP+;

C++ 在c+中使用UDP开发用于文件传输的RDP+;,c++,network-programming,udp,file-transfer,C++,Network Programming,Udp,File Transfer,我需要有关如何设计消息格式、窗口数据结构和确认以及使用UDP的基本文件传输程序的错误检查的帮助。我正在寻找算法或一些基本的源代码来帮助我完成作业 这是我之前做的TCP服务器。我需要窗口结构和重传,配置像丢包的包号,损坏的包号 #include "unp.h" #include <stdio.h> #include <stdlib.h> #include <iostream> #include <fstream> #include <strin

我需要有关如何设计消息格式、窗口数据结构和确认以及使用UDP的基本文件传输程序的错误检查的帮助。我正在寻找算法或一些基本的源代码来帮助我完成作业

这是我之前做的TCP服务器。我需要窗口结构和重传,配置像丢包的包号,损坏的包号

#include "unp.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int Read(int,void*,size_t,int,SA*,socklen_t);
void Write(int,void*,int,int,SA*,socklen_t);
int packetSend(int ,SA* ,socklen_t,int );
int recieveAck(int ,SA* ,socklen_t,int );

const long packetSize = 1024;

 struct Header
 {
  int seqNum,ackNum;
  char da[32];
  char sa[32];

 };

 struct Seg
  {
     Header head;
 char data[packetSize];
  };

    Seg *buffer;
    int nOfPackets;

int    main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in  servaddr, cliaddr;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family      = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port        = htons(SERV_PORT);

bind(sockfd, (SA *) &servaddr, sizeof(servaddr));
    dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));
}


void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
int n;
socklen_t   len;
char        *mesg;
    int size,bytesRead;

    while(1){
    len = clilen;
    mesg= new char [MAXLINE];

        n=Read(sockfd, mesg, MAXLINE, 0, pcliaddr, len);
        cout<<"File Name "<<mesg<<endl;



        int                 sockfd2;
    struct sockaddr_in  servaddr;

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(9878);
    inet_pton(AF_INET,"127.0.0.1"/*argv[1]*/, &servaddr.sin_addr);

    sockfd2 = socket(AF_INET, SOCK_DGRAM, 0);
    //dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));
       socklen_t servlen =  sizeof(servaddr);
    // pcliaddr= &cliaddr;

       ifstream infile (mesg,ifstream::binary);

infile.seekg(0,ifstream::end);
    size=infile.tellg();
    infile.seekg(0);

    nOfPackets = (size/packetSize)+1;
    cout<<"File Size: "<<size<<endl;

    cout<<"Number of Packets: "<<nOfPackets<<endl;
    Write(sockfd2,&size,4,0,(SA *)  &servaddr,servlen );

    buffer = new Seg [nOfPackets];

    bytesRead = 0;
    int count = 0;

     while(bytesRead!=size)
      {
     if(size-bytesRead<packetSize)
      {
          int remaining = size-bytesRead;
          buffer[count].head.seqNum = count;
          infile.read (buffer[count].data,remaining);
          bytesRead += remaining;
       }
     else
      {

          buffer[count].head.seqNum = count;
          infile.read (buffer[count].data,packetSize);
          bytesRead += packetSize;
          count++;
      }
     }

      packetSend (sockfd2,(SA*) &servaddr,servlen,0);



    delete[] mesg;
    infile.close();

}
}

void Write(int sockfd,void* sendline,int lent,int flg, SA* pcliaddr,socklen_t len)
{
sendto(sockfd,sendline, lent, 0, pcliaddr, len);

}


int Read(int sockfd,void* recvline,size_t lent,int flg,SA* pcliaddr,socklen_t len)
{
int n;
n = recvfrom(sockfd,recvline,lent,0, pcliaddr, &len);
return n;
}

int packetSend(int sockfd,SA* pcliaddr,socklen_t len,int i)
{
if(i==nOfPackets)
    return i;
else
{
Seg *seg = new Seg;
seg = &(buffer[i]);
Write(sockfd,seg,sizeof(*seg),0,pcliaddr, len);

if(recieveAck(sockfd,pcliaddr,len,i)==i)
packetSend (sockfd,pcliaddr,len,++i);

else
packetSend (sockfd,pcliaddr,len,i);

}

}

int recieveAck(int sockfd ,SA* pcliaddr,socklen_t len,int num)
{

Header ack;
Read(sockfd, &ack, sizeof(ack), 0, pcliaddr, len);
if(ack.ackNum == num)
{
    return ack.ackNum;
}

else return -1;

}
#包括“unp.h”
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
读取整数(整数,空*,大小,整数,SA*,短节);
无效写入(int,void*,int,int,SA*,socklen\t);
int packetSend(int,SA*,socklen_t,int);
int接收确认(int,SA*,socklen_t,int);
const long packetSize=1024;
结构头
{
int seqNum,ackNum;
char-da[32];
char-sa[32];
};
结构分段
{
头部;
字符数据[packetSize];
};
Seg*缓冲区;
int nOfPackets;
int main(int argc,字符**argv)
{
int-sockfd;
servaddr、cliaddr中的结构sockaddr\u;
sockfd=插座(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servaddr.sin_port=htons(SERV_port);
绑定(sockfd,(SA*)&servaddr,sizeof(servaddr));
dg_echo(sockfd,(SA*)和cliaddr,sizeof(cliaddr));
}
无效dg_echo(内部sockfd,SA*pcliaddr,socklen_t clilen)
{
int n;
索克伦;
char*mesg;
整数大小,字节读取;
而(1){
len=clilen;
mesg=新字符[MAXLINE];
n=读取(sockfd、mesg、MAXLINE、0、pcliaddr、len);

coutSo基本上你想让我们解决你的整个任务?请写下你做了多少。欢迎这么做。如果你做了一些初步的努力,详细阐述了这一点,然后问你遇到了什么困难,那会更好。你需要先学习套接字来处理tcp或udp通信。为什么你需要使用udp?这是一个要求吗?如果因此,请理解,这意味着除非您自己这样做,否则您的文件传输将不可靠。请阅读编写基于套接字的客户端和服务器以交换数据的基础教程。然后,您的下一个问题是您是否应该使用标准FTP协议。以下是我以前所做的。很抱歉进行了编辑。