使用UDP传输图像

时间:2015-09-16 18:22:40

标签: c udp file-transfer

我一直在研究如何在C中使用UDP传输图像,我创建了一个有时可以工作的代码,有时却没有。我认为问题在于,有时服务器会收到比写入更多的包。我知道我正在尝试创建TCP,但这正是我所寻求的,但不知道该怎么做。

我认为要修复它,客户端应该发送img的buff,并在服务器回复客户端时才发送第二部分。

以下是代码:

客户端:

while (!feof(p))
    {
            fread(*&c, 1, BLEN, p);
            sprintf(buf, "%s", *&c);
            temp=sendto(s,buf,BLEN, 0, (struct sockaddr *) &si_other, slen);
            //sleep(3);
            //printf("%d ",temp);
            if(temp < 0)
            {
                    fprintf(stderr,"sendto error.\n");
                    printf("erro");
                    exit(1);
            }
            i++;
    }

服务器:

while(1){
    if(recvfrom(s, buf, BLEN, 0, (struct sockaddr *) &si_other, (unsigned int *) &slen)==-1){
        perror("recvfrom error.\n");
        exit(1);
    }
    //printf("%s ", &si_other);
    flagr[0] = buf[0];
    flagr[1] = buf[1];
    flagr[2] = buf[2];
    if (strcmp(flagr, flag) == 0 ){
            break;
    }
    fwrite(buf, 1, BLEN, pp);
    i++;
}

1 个答案:

答案 0 :(得分:2)

UDP是一种数据报协议,这意味着每次调用sendto都会发送一条消息。如果该消息大于IP数据包可以容纳的消息,则它将在多个IP数据报中分段。如果这些片段中的任何一个未能到达,那么整个操作系统将被删除。

数据需要以不超过大约1450字节的块发送。然后接收方将需要读取每个数据包,因为UDP不保证数据按顺序到达,您需要按正确的顺序重新组装它们。

这意味着每个数据包必须有一个用户定义的标题,其中包含序列号,以便接收者知道将它们放入的顺序。

您还需要担心重新传输,因为UDP不保证实际接收到发送的数据包。

我编写了一个名为UFTP的程序来完成所有这些工作。查看文档和代码,了解通过UDP实现可靠数据传输需要做些什么。