gpt4 book ai didi

linux - POSIX UDP 套接字 : how is the data splitted to UDP packets?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:00 28 4
gpt4 key购买 nike

我有一个 C++-Linux 应用程序,它应该以我公司设计的某种协议(protocol)发送 UDP 数据包。
该协议(protocol)声明每个数据 block 都应在开头附加一个 header ,在结尾附加一个页脚,并且 header +数据+页脚应作为单个 UDP 数据包发送到远程端。例如:打开套接字:

struct hostent *udphost;
udphost = gethostbyname(_remoteIp.c_str());
if(udphost == NULL)
{
ESPFS_DEBUG ("invalid host address format\n" );
return;
}

bzero((char *) &_udpSockAddr, sizeof(_udpSockAddr));
_udpSockAddr.sin_family = AF_INET;
bcopy((char *)udphost->h_addr, (char *)&_udpSockAddr.sin_addr.s_addr, udphost->h_length);
_udpSockAddr.sin_port = htons(UDP_PORT);

发送数据:

protocol_header hdr;  
protocol_footer ftr;
sendto(_udpSocket, hdr, sizeof(hdr), 0, (const struct sockaddr *)&_udpSockAddr, sizeof(_udpSockAddr));
sendto(_udpSocket, data, data_size, 0, (const struct sockaddr *)&_udpSockAddr, sizeof(_udpSockAddr));
sendto(_udpSocket, ftr, sizeof(ftr), 0, (const struct sockaddr *)&_udpSockAddr, sizeof(_udpSockAddr));

现在我的问题是:

  1. 每个 sendto 是否转换为单个 UDP 数据包?意思是我有三个UDP数据包在这里?如果是这样,它在哪里记录?我没有找到任何提及。
  2. 如果不是,我如何向 posix 定义对我来说什么是数据包?
  3. 如何将多个缓冲区作为单个 UDP 数据包发送,知道吗?

最佳答案

每个sendto 都会创建一个UDP 数据包(它可以被分割成多个IP 数据包,这些数据包又可以被链路层分割,等等)。这几乎就是数据报套接字的定义。

如果您有多个缓冲区要在发送前连接起来,您可以使用sendmsg 而不是sendtosendmsg 处理一个struct msghdr,它有msg_iovmsg_iovlen 成员,你可以在其中指定一个缓冲区数组来发送。

Richard Stevens,UNIX 网络编程,仍然很好地解释了所有这些内容。

关于linux - POSIX UDP 套接字 : how is the data splitted to UDP packets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48662127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com