C++ 在c+中使用UDP开发用于文件传输的RDP+;
我需要有关如何设计消息格式、窗口数据结构和确认以及使用UDP的基本文件传输程序的错误检查的帮助。我正在寻找算法或一些基本的源代码来帮助我完成作业 这是我之前做的TCP服务器。我需要窗口结构和重传,配置像丢包的包号,损坏的包号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
#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协议。以下是我以前所做的。很抱歉进行了编辑。