首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在每个片段上发送带有UDP报头的分段数据报

在每个片段上发送带有UDP报头的分段数据报
EN

Stack Overflow用户
提问于 2015-02-07 05:17:42
回答 1查看 1.5K关注 0票数 0

我正在使用一个嵌入式计算机,它必须能够使用UDP与传统计算机通信。当盒子发送大的UDP消息(需要分段)时,每个片段都包含一个UDP报头。因此,如果我想发送一个大的数据报,它将像这样被分成碎片:

代码语言:javascript
运行
复制
[eth hdr][ip hdr][udp hdr][    data 1    ] /* first fragment */
[eth hdr][ip hdr][udp hdr][    data 2    ] /* second fragment */
[eth hdr][ip hdr][udp hdr][  data 3  ]     /* last fragment */

我知道这不是惯例,因为udp报头通常只包含在分段消息的第一个ip数据包中。然而,这对于与我需要对话的其他机器进行通信是非常有效的(例如。使用recvfrom),所以我没有理由深入研究并尝试更改它。

然而,我的问题在于阅读消息。盒子似乎期望以同样的方式向其发送零碎的udp数据报。我的意思是,它希望每个ipv4片段都有一个udp报头。在尝试改变这一点之前(这是一个相当特殊和复杂的平台),我想知道是否有任何方法可以配置sendto()或任何其他这样的函数来以这种格式发送udp消息。在监控流量时,我发现那些udp报头不存在。

非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-02-07 15:09:51

不是的。套接字不是这样工作的。只需编写您自己的sendto包装器,在您选择的任何缓冲区大小边界上手动分割多个UDP数据包中的帧即可。这将会达到你想要的效果。

示例代码如下:

代码语言:javascript
运行
复制
ssize_t fragmented_sendto(int sockfd, const void *buf, size_t len, int flags,
           const struct sockaddr *dest_addr, socklen_t addrlen, size_t MAX_PACKET_SIZE)
{
    unsigned char* ptr = (unsigned char*) buf;

    size_t total = 0;

    while (total <= len)
    {
       size_t newsize = len - total;
       if (newsize > MAX_PACKET_SIZE)
       {
           newsize = MAX_PACKET_SIZE;
       }
       ssize_t result = sendto(sockfd, ptr, newsize, flags, dest_addr, addrlen);
       if (result < 0)
       {
          // handle error
          return -1;
       }
       else
       {
          total += result;
          ptr += result;
       }
    }
    return (ssize_t)total;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28374957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档