接口描述
- 支持广播发送
- 支持UDP单播发送
- 正确返回0,错误返回-1
代码
</
/* ip = 0表示广播,非0则udp单播 */
int config_brocast_msg(uint32_t ip, uint16_t port, uint8_t *jsonmsg, int len)
{
int sock;
int so_broadcast = 1;
struct sockaddr_in broadcast_addr;
int ret;
int from_len = sizeof(struct sockaddr_in);
uint8_t *msgbuf;
int msglen = 0, real_len = 0;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
cfg_dbg(ERROR, " %s create socket fail(%s)\n", __func__, strerror(errno));
return -1;
}
if (!ip) {
//默认的套接字描述符sock是不支持广播,必须设置套接字描述符以支持广播
ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &so_broadcast,
sizeof(so_broadcast));
if (ret) {
cfg_dbg(ERROR, " %s get eth0 brocast ip fail(%s)\n", __func__, strerror(errno));
goto fail;
}
ret = get_local_brocast_ip("eth0", &broadcast_addr);
if (ret) {
cfg_dbg(BROAD, " %s get eth0 brocast ip fail(%d, %s)\n", __func__, ret, strerror(errno));
ret = get_local_brocast_ip("br0", &broadcast_addr);
if (ret) {
cfg_dbg(WARN, " %s get br0 brocast ip fail(%d, %s)\n", __func__, ret, strerror(errno));
goto fail;
}
}
cfg_dbg(BROAD, "Broadcast-IP: %s\n", inet_ntoa(broadcast_addr.sin_addr));
} else {
bzero(&broadcast_addr, sizeof(broadcast_addr));
broadcast_addr.sin_addr.s_addr = ip;
}
broadcast_addr.sin_family = AF_INET;
broadcast_addr.sin_port = htons(port);
msglen = len;
msgbuf = jsonmsg;
send_again:
ret = sendto(sock, msgbuf + real_len, msglen - real_len, 0,
(struct sockaddr*) &broadcast_addr, sizeof(broadcast_addr));
if (ret < 0) {
cfg_dbg(ERROR, " %s sendto brocast msg fail(%s)\n", func, strerror(errno));
} else if ((real_len + ret) < msglen) {
cfg_dbg(WARN, " %s sendto broacast len(%d), real write(%d)\n", func, msglen, ret);
real_len += ret;
goto send_again;
}
close(sock);
return 0;
fail:
close(sock);
return;
}