Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
部分udp文件传输 我有以下基本的C++代码,通过Linux上的套接字通过UDP传输文件。 问题是,并不是所有的数据包都被发送(比如只接收到345kb中的8个字节),我知道UDP不可靠,但这是否与我的代码有关,或者仅仅是因为UDP不可靠_C++_Sockets_Udp - Fatal编程技术网

部分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");
//}