Windows中C语言网络编程时调用setsockopt设置组播参数报错10042(WSAENOPROTOOPT)
2024-07-04
32
问题描述
在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 Dont 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 /* dont fragment IP datagrams */
所以需要再include Ws2tcpip.h头文件,使用该文件中定义的IP_ADD_MEMBERSHIP值,即可解决报10042错误的问题。
更新于:2个月前赞一波!
相关文章
- 生成带参数的二维码
- MySQL5.7 中使用 group by 报错 this is incompatible with sql_mode=only_full_group_by
- linux中Qt工程编译报错: error: 找不到 -lGL
- PHP7.4命令行报错:VC运行库和PHP版本不兼容
- 打开vmware虚拟机报错—该虚拟机似乎正在使用中
- 前端请求PHP接口,报错跨域问题
- Apache报错:无法使用可靠的服务器域名
- Nginx配置文件(nginx.conf)配置参数详解
- mysql报错xamp table 'pma__recent' is read only
- composer 全局参数
- 浏览器报错 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- linux编译报错:/usr/include/c++/7/cstdlib:41:10: fatal error: bits/c++config.h: No such file or directory
- Linux下编译libxml源码时,报错:/usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:4: error: call to '__open...
- Linux下编译libxml2的源码报错:you must specify a host type if you use `--no-verify'
- 在Linux中使用C#(mono)进行组播通讯时如何绑定到指定网卡
- vscode中通过ssh远程连接linux报错:Bad owner or permissions on C:\\Users\\用户名/.ssh/config
- Open SUSE Linux中编译内核模块报错
- EF报错Win32Exception: 证书链是由不受信任的颁发机构颁发的。
- EF Core 8 (EF8) Contains报错:Microsoft.Data.SqlClient.SqlException (0x80131904): 关键字 'WITH' 附近有语法错误。
- C/C++使用gcc或g++编译报错:error: parameter ‘xxx’ set but not used [-Werror=unused-but-set-parameter]
文章评论
全部评论