部分udp文件传输 我有以下基本的C++代码,通过Linux上的套接字通过UDP传输文件。 问题是,并不是所有的数据包都被发送(比如只接收到345kb中的8个字节),我知道UDP不可靠,但这是否与我的代码有关,或者仅仅是因为UDP不可靠
客户端部分udp文件传输 我有以下基本的C++代码,通过Linux上的套接字通过UDP传输文件。 问题是,并不是所有的数据包都被发送(比如只接收到345kb中的8个字节),我知道UDP不可靠,但这是否与我的代码有关,或者仅仅是因为UDP不可靠,c++,sockets,udp,C++,Sockets,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*
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");
}
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.sinu port=htons(32000);
ifstream myfile(“345kb.doc”,ios::in);
int i=0;
char*memblock;
双倍大小;
如果(myfile.is_open()){
seekg(0,ios::end);
size=(双精度)myfile.tellg();
memblock=新字符[1024];
seekg(0,ios::beg);
双文件大小=大小;
cout两者都是正确的:
- UDP并不意味着在不实现检查、重新排序和重新传输的情况下用于文件传输。与其通过UDP实现所有这些,不如切换到TCP。资源有限的嵌入式系统很少例外
- 在您的代码中,您使用
strlen
获取块长度,因为文件(很可能)是二进制的,这会产生不正确的长度值,并且您不会传输整个文件数据。strlen
对以零结尾的字符串进行操作,并且只对数据中的前0字节进行计数
要获得更正确的结果,最简单的方法是用min(1024,filesize)
替换strlen(memblock)
。这不是一个完美的解决方案,因为它无法准确检查myfile读取的字节数。read
您可以尝试将传输类型更改为TCP(如果这是可能的服务器端,否则只需使用netcat
例如)并查看您的文件是否正确传递。如果没有,这是您的代码的问题。我使用TCP获得了它,但我只想尝试使用UDP,以使其正常工作…服务器也是recvfrom()只有一次我们有2013年。解决了这个问题后,你应该非常迫切地熟悉IPv6。感谢你的回复,我现在正在尝试你是对的strlen是一个错误,我改变了它,但现在我收到了部分文件(比如345kb中的100kb),但服务器(接收器)再次卡在那一点上,无法退出。。。
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");
//}