gpt4 book ai didi

c++ - 部分udp文件传输

转载 作者:行者123 更新时间:2023-11-30 02:53:46 25 4
gpt4 key购买 nike

我有以下基本的 C++ 代码,用于在 Linux 上使用套接字通过 UDP 传输文件。问题是,并不是所有的数据包都被传送(比如只收到 345kb 中的 8 个字节),我知道 UDP 不可靠,但这是否与我的代码有关,或者仅仅是因为 UDP 的不可靠性?

客户端

sockfd=socket(AF_INET,SOCK_DGRAM,0);

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr("192.168.0.152");
servaddr.sin_port=htons(32000);
ifstream myfile("345kb.doc", ios::in);
int i=0;
char* memblock;
double size;
if(myfile.is_open()) {
myfile.seekg(0,ios::end);
size=(double)myfile.tellg();
memblock=new char[1024];
myfile.seekg(0,ios::beg);
double filesize=size;
cout<<filesize;
int n;
int ab=(int)filesize%1024;
while(filesize>1024){
myfile.read(memblock,1024);
cout<<"\nREAD:"<<strlen(memblock)<<"\n"<<"SENT:";
n=sendto(sockfd,memblock,strlen(memblock),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
filesize=filesize-1024;
cout<<n<<"\n";
}
myfile.read(memblock,1024);
n=sendto(sockfd,memblock,strlen(memblock),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
std::cout<<"HI"<<endl;
} else {
printf("\nFILE NOT OPENED \n");
}

服务器端

int sockfd,n;
struct sockaddr_in servaddr,cliaddr;
socklen_t len;
char mesg[1024];

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(32000);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

//for (;;)
//{
ofstream myfile;
myfile.open("345kbsssss.doc",ios::out|ios::app);
if(myfile.is_open()) {
long i=0;
len = sizeof(cliaddr);
while((n = recvfrom(sockfd,mesg,1024,0,(struct sockaddr *)&cliaddr,&len))>0){
std::cout<<"HI\n";
//n=recvfrom(sockfd,mesg,256,0,(struct sockaddr *)&cliaddr,&len);
myfile.write(mesg,n);
}
}
else printf("\nFILE NOT CREATED\n");
//}

最佳答案

两者都是正确的:

  • UDP 不能在不执行检查、重新排序和重新传输的情况下用于文件传输。与其通过 UDP 实现所有这些,不如切换到 TCP 更好。除了资源有限的嵌入式系统这一极少数异常(exception)。

  • 在您的代码中,您使用 strlen 获取 block 长度,因为文件(很可能)是二进制文件,这会产生不正确的长度值,并且您不会传输整个文件数据。 strlen 对以零结尾的字符串进行操作,并且只计算数据中的第一个 0 字节。

要获得更正确的结果,最简单的方法是将 strlen(memblock) 替换为 min(1024,filesize)。这不是一个完美的解决方案,因为它不会检查 myfile.read 读取了多少字节。

关于c++ - 部分udp文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17651769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com