UDP发送的接口C语言

保存下一个UDP发送的C接口

接口描述

  1. 支持广播发送
  2. 支持UDP单播发送
  3. 正确返回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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zcqiang_zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值