Windows Socket编程调用recvfrom()出现WSA Error:10022问题求助
问题1:recvfrom返回10022错误的修复方案
触发错误的核心原因有3个,按优先级修改即可:
- 未初始化recvfrom的地址长度参数
代码中定义了int saddr_len;但没有赋值,Windows的recvfrom要求传入的地址长度参数必须提前初始化为目标地址结构体的大小,在调用recvfrom前添加一行:saddr_len = sizeof(SOCKADDR_STORAGE); - 原始套接字协议类型选择错误
Windows下IPPROTO_RAW类型的原始套接字仅支持发送自定义IP报文,不支持接收数据。如果需要接收IP层报文,创建套接字时需要将第三个参数改为IPPROTO_IP,如果仅需要接收特定协议的报文,可以改为IPPROTO_UDP/IPPROTO_TCP等对应值:int sock_fd = socket(AF_INET, SOCK_RAW, IPPROTO_IP); - 未绑定网卡接口
和Linux下原始套接字可以不绑定直接抓包的逻辑不同,Windows下原始套接字必须显式bind到你要抓包的本地网卡的IP地址,才能正常接收对应网卡的流量。 - 额外注意:运行原始套接字相关程序必须以管理员身份启动,否则创建套接字阶段就会权限不足。
问题2:Windows下协议头结构对应头文件
Windows平台有原生的协议头定义,不需要自己手动实现:
- 头文件引用
ws2ipdef.h、iphlpapi.h即可获得常用的协议头结构 - IPv4头对应结构为
IPV4_HDR,UDP头对应结构为UDP_HDR,TCP头对应结构为TCP_HDR,和Linux下ip.h、udp.h的结构字段定义基本一致。
内容的提问来源于stack exchange,提问作者StwayneXG
相关产品推荐
相关产品推荐

