Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
C 套接字程序-使用UDP进行可靠的数据传输_C_Sockets_Networking - Fatal编程技术网

C 套接字程序-使用UDP进行可靠的数据传输

C 套接字程序-使用UDP进行可靠的数据传输,c,sockets,networking,C,Sockets,Networking,我已经用C编写了可靠数据传输的代码。在这里,客户机将1024字节的文件发送到服务器。服务器将接收到的数据包写入另一个文件 该程序适用于字符串文件/二进制数据文件。但是,当我试图复制图像文件时,出现了问题。当我尝试传输.jpg文件时,没有编译错误或运行时错误。但当我尝试打开目标文件时,它会说, 无法打开图像文件“,”解释jpeg文件“”时出错。在状态201中对jpeg库的调用不正确 有人能研究一下代码并提出解决方案吗 这是我的客户代码 #include<stdio.h> #includ

我已经用C编写了可靠数据传输的代码。在这里,客户机将1024字节的文件发送到服务器。服务器将接收到的数据包写入另一个文件

该程序适用于字符串文件/二进制数据文件。但是,当我试图复制图像文件时,出现了问题。当我尝试传输.jpg文件时,没有编译错误或运行时错误。但当我尝试打开目标文件时,它会说, 无法打开图像文件“,”解释jpeg文件“”时出错。在状态201中对jpeg库的调用不正确

有人能研究一下代码并提出解决方案吗

这是我的客户代码

#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<arpa/inet.h>

char *itoa(long i,char *s,int dummy_radix)
{
    sprintf(s,"%ld",i);
    return s;
}

int main(int argc, int *argv[])
{
    int sock,length,n;
    struct sockaddr_in server,from;
    struct hostent *hp;
    long int packets =0;
    unsigned char buff[1024] = {0};

    // checking if hostname and the port address is provided //
    if(argc!=3)
    {
        printf("insufficient arguments\n");
        exit(1);
    }

    //create a socket//
    sock = socket(AF_INET,SOCK_DGRAM,0);

    if(sock<0)
    {
        printf("error in opening socket\n");
        return 1;
    }

    //to get  the hostname of the system or the machine//
    hp= gethostbyname(argv[1]);

    if(hp==0)
    {
        printf("Unknown host\n");
        return 1;
    }
    //build the server's IP address //
    bzero((char *)&server,sizeof(server));
    bcopy((char*)hp->h_addr,(char *)&server.sin_addr,hp->h_length);
    server.sin_family = AF_INET;
    server.sin_port =  htons(atoi(argv[2]));
    length = sizeof(server);

    /*open the file that we wish to transfer*/
    FILE *fp = fopen("landscape.jpeg","rb");
    if(fp==NULL)
    {
        printf("file open error");
        return 1;
    }
    fseek(fp,0,SEEK_END); //if exists read the size of the file 
    size_t file_size = ftell(fp);
    fseek(fp,0,SEEK_SET); 

    printf("size of the file is %d\n", file_size);

    /*find the number of packets*/
    packets = (file_size/1024)+1 ;

    /*send the number of packets to the server*/
    itoa(packets,buff,10);
    n = sendto(sock,buff,strlen(buff),0,(struct sockaddr *)&server,sizeof(struct sockaddr));
    if(n<0)
    {
        printf("error in sending message to the serveR");
        return 1;
    }

    /*Read data from file and send it*/
    int packetNum = 0;
    while(1)
    {
        /*First read file in chunks of  1024  bytes */
        int nread = fread(buff,1,1024,fp);
        //printf("Bytes read %d\n",nread);

        /*if read was success ,send data*/
        if(nread>0)
        {
            //printf("data sent now is %s\n",buff);
            n = sendto(sock,buff,strlen(buff),0,(struct sockaddr *)&server,sizeof(struct sockaddr));
            printf("Sending %d, numBytes sent: %d\n", packetNum, n);
            packetNum++;
            if(n<0)
            {
                printf("error in sending message to the server");
                fclose(fp);
                return 1;
            }
        }

        /*There is something tricky going on with the read..
         * Either there was error ,or we reached end of  file.
         */
        if(nread<1024)
        {
            if(feof(fp))
                printf("End of file\n");

            if(ferror(fp))
                printf("Error reading\n");
            break;
        }
    }
    close(sock);
    fclose(fp);

    return 0;
}
这是我的服务器代码

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<arpa/inet.h>

int main(int argc, char *argv[])
{
    int sock,length,fromlen,n;
    struct sockaddr_in server;
    struct sockaddr_in from;
    char buf[1024];
    char file_buf[1024];
    int packets = 0;
    int received = 0;
    FILE *newfp;
    newfp = fopen("output.jpeg","wb");
    if(newfp==NULL)
    {
        printf("error opening the file\n");
        return 1;
    }    
    if(argc<2)
    {
        fprintf(stderr, "no port number specified\n");
        exit(0);
    }
    sock = socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0)
    {
        printf("error in opening socket\n");
        return 1;
    }
    length = sizeof(server);
    bzero(&server,length);
    server.sin_family= AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(atoi(argv[1]));
    if(bind(sock,(struct sockaddr*)&server,length)<0)
    {
        printf("cannot bind\n");
        return 1;
    }
    fromlen = sizeof(struct sockaddr_in);
    n = recvfrom(sock,buf,1024,0,(struct sockaddr *)&from,&fromlen);
    if(n<0)
    {
        printf("recvfrom  error\n");
        return 1;
    }

    packets = atoi(buf);
    printf("Num packets expected: %d\n", packets);

    while(received<packets)
    {
        n = recvfrom(sock,buf,sizeof (buf),0,(struct sockaddr *)&from,&fromlen);    

        //printf ("%d\n", n);
        printf("Packet num %d, numBytes received: %d\n", received, n);

        if(n<0)
        {
            printf("recvfrom  error\n");
            return 1;
        }
        //printf("%s",buf);
        if((fwrite(buf,1,n,newfp)) < n)
        {
            printf("error in writing to the file\n");
            return 1;
        }
        received++;
    }
    printf("Finished\n");
    fclose(newfp);
    return 0;
}
您假设fread null终止缓冲区。没有。 您假设数据不包含其他空值:它可以。 发送文件数据时,应使用nread而不是strlenbuffer作为计数参数。 文件结尾的正确测试不是nread<1024,它可以在任何时候发生:它是nread==0。 您不会处理顺序错误的数据包,也不会处理丢失或重复的数据包。事实上,这段代码根本不可靠。您需要数据包中的序列号,在将数据写入文件时,这些序列号会被删除;对于丢失的数据包,您需要ACK或NACK机制;您需要一种忽略重复项的机制。。。
您才刚刚开始。

如果不包含代码,则很难做到这一点。“It displays error”不是问题描述。看起来您依赖的是按顺序到达的UDP数据包,或者根本没有,但不一定如此。尝试一些足够长的文本,以便在多个块之间分割。这是学校布置的作业吗?是的,它对足够长的课文很有效。问题在于.jpg文件或任何其他图像文件;而且数据不包含其他空值:它可以。发送文件数据时,应使用nread而不是strlenbuffer作为计数参数。对于文件结尾的正确测试不是nread<1024,这在任何时候都可能发生:它是nread==0。