【问题标题】:Using UDP transfer image使用 UDP 传输镜像
【发布时间】:2015-09-16 18:22:40
【问题描述】:

我一直在研究如何在 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++;
}

【问题讨论】:

  • 只是出于好奇,而不是批评……为什么?我的意思是,这应该解决什么,仅使用 TCP 不会?
  • Sendto 设置errno,因此您应该将fprintf(stderr,"sendto error.\n"); 替换为perror("sendto")

标签: c udp file-transfer


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多