繁体   English   中英

是否可以配置 UDP 多播套接字以便可以调用 write() 而不是 sendto()?

[英]Can a UDP multicast socket be configured so that write() can be called rather than sendto()?

我正在 Linux Ubuntu 上编写 C++ 多播应用程序。

在我的 C++ 多播发送器类中,我这样做:

uint16_t port = 5678;
const char* group = "239.128.128.128";

int fd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(group);
addr.sin_port = htons(port);

const char* buf = "Hi there";
size_t bytes_to_write = 8;

size_t bytes_sent = sendto(fd, buf, bytes_to_write, 0, (struct sockaddr*) &addr, sizeof(addr));

有什么方法可以配置文件描述符,以便我可以调用 write() 而不是 sendto()? 我原以为会有一个 setsockopt 选项或类似的选项来做到这一点?

是的。

根据文档man 7 udp

在套接字上调用 connect(2) 时,会设置默认目标地址,现在可以使用 send(2) 或 write(2) 发送数据报,而无需指定目标地址。

并且,一般来说, connect的 POSIX 规范说

如果发起套接字不是连接模式,则 connect() 应设置套接字的对等地址,并且不建立连接。 对于 SOCK_DGRAM 套接字,对等地址标识所有数据报在后续 send() 函数上的发送位置,并限制后续 recv() 函数的远程发送方。

检查这些东西的文档总是值得的,它并不是那么难以理解。 FWIW 我不记得你是否需要connect()bind()为此,我花了几秒钟才找出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM