IP_ADD_MEMBERSHIP 失败

本文详细介绍了如何在本地设备上使用setsockopt函数加入多播组,并针对不同socket版本中IP_ADD_MEMBERSHIP值的差异进行了说明。通过实例演示了在解决版本兼容性问题时的具体步骤,确保了网络应用能够正常运行。
    /*将本机加入多播组*/
    err = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));
    if (err < 0)
    {
        perror("setsockopt():IP_ADD_MEMBERSHIP");
        exit(1);
    }


因为不同的socket版本,定义IP_ADD_MEMBERSHIP 的值不同:

in socket ver1.0中:
#define IP_ADD_MEMBERSHIP 5

in socket ver2.0中:
#define IP_ADD_MEMBERSHIP 12


改为:

err = setsockopt(fd, IPPROTO_IP, 12,&mreq, sizeof(mreq));

转载于:https://www.cnblogs.com/hehehaha/p/6332278.html

解释一下下面的代码 /****************************************************************************** * 函数名称: onvif_discv_start() * 函数描述: onvif discover处理模块启动函数 * 输 入: N/A * 输 出: N/A * 返 回 值: ERROR/OK ******************************************************************************/ S32 onvif_discv_start() { int on = 1; ONVIF_INFO("Onvif discovery start"); g_soap_for_discv = new_soap(); if (g_soap_for_discv == NULL) { ONVIF_ERROR("Malloc g_soap_for_discv failed"); return ERROR; } g_soap_for_discv->sock = sock_create_udp(INADDR_ANY, ONVIF_PORT_FOR_DISCV); if (g_soap_for_discv->sock < 0) { ONVIF_ERROR("Sock_create_udp failed"); free_soap(g_soap_for_discv); g_soap_for_discv = NULL; return ERROR; } if (sock_non_block(g_soap_for_discv->sock) < 0) { ONVIF_WARN("Sock_non_block fail with errno:%d", errno); } g_index_for_discv = inet_add_socket(g_soap_for_discv->sock, (void*)onvif_discover_handle, NULL, NULL); if (g_index_for_discv < 0) { ONVIF_ERROR("Inet_socket_add failed"); close(g_soap_for_discv->sock); g_soap_for_discv->sock = -1; free_soap(g_soap_for_discv); g_soap_for_discv = NULL; return ERROR; } if (0 > setsockopt(g_soap_for_discv->sock, IPPROTO_IP, IP_PKTINFO, &on, sizeof(on))) { ONVIF_WARN("setsockopt IP_PKTINFO failed."); } if (0 > onvif_set_sock_rcvbuf(g_soap_for_discv->sock, ONVIF_SOCKET_RECV_BUF_SIZE)) { ONVIF_WARN("setsockopt SO_RCVBUF failed."); } if (0 > onvif_set_sock_sndbuf(g_soap_for_discv->sock, ONVIF_SOCKET_SEND_BUF_SIZE)) { ONVIF_WARN("setsockopt SO_SNDBUF failed."); } if (sock_mcast_ttl(g_soap_for_discv->sock, ONVIF_TTL) < 0) { ONVIF_WARN("setsockopt IP_MULTICAST_TTL fail with errno:%d", errno); } if (sock_mcast_group(g_soap_for_discv->sock, htonl(INADDR_ANY), inet_addr(ONVIF_MCAST_IP)) < 0) { ONVIF_WARN("setsockopt IP_ADD_MEMBERSHIP fail with errno:%d", errno); } if (sock_mcast_if(g_soap_for_discv->sock, htonl(INADDR_ANY)) < 0) { ONVIF_WARN("setsockopt IP_MULTICAST_IF fail with errno:%d", errno); } return OK; }
最新发布
08-30
============wifi_hal_1 start=============== static int skw_add_membership(struct nl_sock *sk, const char *group) { int id = skw_get_multicast_id(sk, group); if (id < 0) { ALOGE("Could not find group %s", group); return id; } int ret = nl_socket_add_membership(sk, id); if (ret < 0) ALOGE("Could not add membership to group %s", group); return ret; } static wifi_error skw_wifi_event_init(hal_info *hal) { int err; hal->nl_event = skw_create_socket(WIFI_HAL_SOCK_EVENT_PORT); if (hal->nl_event == NULL) { ALOGE("%s: create event socket failed", __func__); return WIFI_ERROR_UNKNOWN; } //nl_socket_modify_cb(hal->nl_event, NL_CB_SEQ_CHECK, no_seq_check, &err); nl_socket_modify_cb(hal->nl_event, NL_CB_VALID, NL_CB_CUSTOM, evtHandler, &err); skw_add_membership(hal->nl_event, "scan"); skw_add_membership(hal->nl_event, "mlme"); skw_add_membership(hal->nl_event, "vendor"); skw_add_membership(hal->nl_event, "regulatory"); return WIFI_SUCCESS; } static nl_sock *skw_create_socket(int port) { struct nl_sock * sock = NULL; uint32_t pid = getpid() & 0x3FFFFF; sock = nl_socket_alloc(); if (sock == NULL) { ALOGE("%s: socked alloc failed", __func__); return NULL; } nl_socket_set_local_port(sock, pid + (port << 22)); if (nl_connect(sock, NETLINK_GENERIC)) { ALOGE("%s: connect failed", __func__); nl_socket_free(sock); return NULL; } if (nl_socket_set_buffer_size(sock, SOCK_BUFF_SIZE, 0) < 0) ALOGE("cmd_sock: set RX buffer failed, %d", strerror(errno)); return sock; } static wifi_error skw_wifi_hal_init(hal_info *hal) { hal->nl_hal = skw_create_socket(WIFI_HAL_SOCK_DEFAULT_PORT); if (hal->nl_hal == NULL) { ALOGE("%s: create command socket failed", __func__); return WIFI_ERROR_UNKNOWN; } hal->family_nl80211 = genl_ctrl_resolve(hal->nl_hal, "nl80211"); if (hal->family_nl80211 < 0) { nl_socket_free(hal->nl_hal); ALOGE("%s: resolve nl80211 id failed", __func__); return WIFI_ERROR_UNKNOWN; } return WIFI_SUCCESS; } static wifi_error skw_wifi_initialize(wifi_handle *handle) { wifi_error err; hal_info *hal = NULL; ALOGD("%s", __func__); hal = (hal_info *)malloc(sizeof(hal_info)); if (hal == NULL) { ALOGE("%s: alloc hal_info failed", __func__); return WIFI_ERROR_OUT_OF_MEMORY; } memset(hal, 0, sizeof(*hal)); if (socketpair(AF_UNIX, SOCK_STREAM, 0, hal->exit_socks) == -1) { ALOGE("socketpair failed"); free(hal); return WIFI_ERROR_UNKNOWN; } err = skw_wifi_hal_init(hal); if (err != WIFI_SUCCESS) { free(hal); return err; } err = skw_wifi_event_init(hal); if (err != WIFI_SUCCESS) { skw_wifi_hal_deinit(hal); free(hal); return err; } *handle = (wifi_handle)hal; return WIFI_SUCCESS; } ============wifi_hal_1 end===============
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值