gpt4 book ai didi

使用::write 的 C++ UDP 广播

转载 作者:太空宇宙 更新时间:2023-11-04 10:08:30 24 4
gpt4 key购买 nike

我正在编写一个 UDP 客户端/服务器应用程序。服务器是广播服务器,它在特定端口上向同一子网上的两个客户端广播。每个客户端接收数据报并向服务器发送响应。每个客户端都预先知道服务器的IP地址。

我的客户端基本上就是http://man7.org/linux/man-pages/man3/getaddrinfo.3.html的客户端例子,即它使用 connect() 函数来指定所有传出数据包的端点。通过使用连接的 UDP,客户端可以对套接字文件描述符使用 read() 和 write() 而不是 sendto/recvfrom。

对于我的服务器,我想采用类似的方法——配置用于广播的套接字,并在文件描述符上调用读/写。我可以 bind() 套接字以监听指定端口上的传入数据报,并且可以很好地收集这些数据报。

减去错误检查,我的服务器代码如下所示:

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

int broadcast = 1;
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof int);

struct sockaddr_in servaddr;
memset((char*) &servaddr, 0, sizeof servaddr);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

int success = bind(sockfd, (struct sockaddr*) &servaddr, sizeof servaddr);

int BUFSIZE = 256;
char buf[BUFSIZE];

while (1)
{
// this works fine
int bytes_read = read(sockfd, buf, BUFSIZE);

// WANT TO BROADCAST HERE
int bytes_written = write(sockfd, buf, bytes_read);
}

但是,当我尝试在 write() 行中广播数据包时,我收到“未指定目标地址”错误。我可以调用 connect() 来设置目标地址,但我认为 connect() 不适用于广播套接字。

有没有使用 write() 而不是 sendto 的广播方式?

最佳答案

使用 connect() 进行广播的问题在于(除了修改 send()/write() 的行为),connect() 会在套接字上安装一个过滤器,以便它只接收来源为- IP 字段与 connect() 的参数中指定的 IP 地址相匹配。

这意味着如果您使用广播地址作为参数在套接字上调用 connect(),那么您的套接字将只接收来自该广播地址的数据包——但数据包永远不会(AFAIK)标记为来自广播地址——相反,它们的 Source-IP 字段像往常一样设置为发送数据包的计算机的 IP 地址。结果是,如果您将套接字 connect() 到广播地址,您将不会在该套接字上收到任何数据包。

关于使用::write 的 C++ UDP 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50608327/

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