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

时间:2019-03-11 10:44:08

标签: c++ linux sockets udp multicast

我正在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选项或类似的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

是的

根据文档man 7 udp

  

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

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

  

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

总是值得检查这些东西的文档,这不是 不可理解的。 FWIW我记不清您是需要connect()还是bind()了,花了我几秒钟才知道。