侧边栏壁纸
  • 累计撰写 185 篇文章
  • 累计创建 77 个标签
  • 累计收到 17 条评论

目 录CONTENT

文章目录

Windows中C语言网络编程时调用setsockopt设置组播参数报错10042(WSAENOPROTOOPT)

码峰
2023-02-02 / 0 评论 / 0 点赞 / 1,052 阅读 / 372 字 / 正在检测是否收录...
广告 广告

问题描述

在Windows中使用C语言进行网络编程时,调用函数setsockopt设置组播参数IP_ADD_MEMBERSHIP,返回10042(WSAENOPROTOOPT)的错误代码,设置代码如下:

/* join a multicast group */
if (multiaddr)
{ 
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr(multiaddr);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
    if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0)
    {
        printf("setsockopt error, code;"<<WSAGetLastError());
    }
}

以上改代码在调用setsockopt失败了,返回错误号为10042。

原因和解决

后来发现程序默认使用的是Winsock.h头文件,在该头文件中IP_ADD_MEMBERSHIP的值为5

#define IP_OPTIONS          1           /* set/get IP per-packet options    */
#define IP_MULTICAST_IF     2           /* set/get IP multicast interface   */
#define IP_MULTICAST_TTL    3           /* set/get IP multicast timetolive  */
#define IP_MULTICAST_LOOP   4           /* set/get IP multicast loopback    */
#define IP_ADD_MEMBERSHIP   5           /* add  an IP group membership      */
#define IP_DROP_MEMBERSHIP  6           /* drop an IP group membership      */
#define IP_TTL              7           /* set/get IP Time To Live          */
#define IP_TOS              8           /* set/get IP Type Of Service       */
#define IP_DONTFRAGMENT     9           /* set/get IP Don't Fragment flag   */

而实际要使用的IP_ADD_MEMBERSHIP值是定义在Ws2tcpip.h头文件中

#define IP_MULTICAST_IF     9 /* set/get IP multicast i/f  */
#define IP_MULTICAST_TTL       10 /* set/get IP multicast ttl */
#define IP_MULTICAST_LOOP      11 /*set/get IP multicast loopback */
#define IP_ADD_MEMBERSHIP      12 /* add an IP group membership */
#define IP_DROP_MEMBERSHIP     13/* drop an IP group membership */
#define IP_DONTFRAGMENT     14 /* don't fragment IP datagrams */

所以需要再include Ws2tcpip.h头文件,使用该文件中定义的IP_ADD_MEMBERSHIP值,即可解决报10042错误的问题。

0
广告 广告

评论区