套接字编程:在UDP上发送数据包(C ++)

时间:2014-10-14 20:54:23

标签: c++ c sockets networking udp

我正在尝试在UDP中发送数据包消息(具有标头和数据数组)。 我处于初级阶段,消息中没有数据,我想发送这个头,它由struct结构和嵌套枚举表示。

还有其他方法在UDP上发送数据,然后序列化所述结构然后构造缓冲区数据并发送它们吗?就像c,c ++套接字编程中的缓冲例程一样发送数据包

2 个答案:

答案 0 :(得分:0)

如果struct是字节对齐的并且只使用POD类型,则可以将结构直接传递给sendto(),而不先将其复制到另一个缓冲区,例如:

#pragma pack(push, 1) // or other platform-appropriate pack statement
struct myHdr
{
    uint8_t type;
    uint16_t len;
    //...
};
#pragma pack(pop)

myHdr hdr;
hdr.type = ...;
hdr.len = ...;
...

send(fd, &hdr, sizeof(hdr), 0);

但这种做法确实会让人不悦。一旦开始添加数据,它就没有多大帮助。但是你可以分配一个缓冲区并使用字节对齐的struct来填充缓冲区,至少:

#pragma pack(push, 1) // or other platform-appropriate pack statement
struct myHdr
{
    uint8_t type;
    uint16_t len;
    //...
};
#pragma pack(pop)

uint8_t buffer[65535];
myHdr *hdr = (myHdr*) &buffer[0];
hdr->type = ...;
hdr->len = ...;
...
// fill in &buffer[sizeof(myHdr)] onwards as needed

send(fd, buffer, sizeof(myHdr)+..., 0);

答案 1 :(得分:0)

这正是sendmsg()函数的用途。它提供了“聚集 - 写入”设施。您为它提供了一个或多个(可能为零或更多)缓冲区地址和长度,并将它们一起收集到一个发送中。

但是你不应该使用struct作为网络协议。使用网络协议作为网络协议。用八位字节定义自己的应用程序协议,并自己编写一个库,将结构打包并从八位字节流中解压缩。

或使用XDR或其同源词。