C++ UDP广播:使用::写入

C++ UDP广播:使用::写入,c++,linux,sockets,udp,broadcast,C++,Linux,Sockets,Udp,Broadcast,我正在编写一个UDP客户机/服务器应用程序。服务器是一个广播服务器,它在特定端口上向同一子网上的两个客户端广播。每个客户端接收一个数据报并向服务器发送响应。每个客户端都预先知道服务器的ip地址 我的客户机与的客户机示例基本相同,即它使用connect函数指定所有传出数据包的端点。通过使用连接的UDP,客户端可以对套接字文件描述符进行读写,而不是sendto/recvfrom 对于我的服务器,我希望采用类似的方法—配置用于广播的套接字,并调用文件描述符上的读/写。我可以绑定套接字以侦听指定端口上的

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

我的客户机与的客户机示例基本相同,即它使用connect函数指定所有传出数据包的端点。通过使用连接的UDP,客户端可以对套接字文件描述符进行读写,而不是sendto/recvfrom

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

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

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); 
}
但是,当我尝试在写入行中广播数据包时,会出现“未指定目标地址”错误。我可以调用connect来设置目标地址,但我认为connect在广播套接字上不起作用


有没有一种广播方式是使用write而不是sendto

使用connect进行广播的问题在于,除了修改发送/写入行为外,connect还会在套接字上安装一个筛选器,以便它只接收源IP字段与要连接的参数中指定的IP地址匹配的数据包

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