【发布时间】:2018-05-30 15:20:51
【问题描述】:
我正在编写一个 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 进行广播的方法?
【问题讨论】:
标签: c++ linux sockets udp broadcast