关于原始套接字socket初始化失败

socket(AF_INET,SOCK_RAW,protocol);
其中protocol设置为ICMP、TCP等等时可以成功创建,但是设置为IP包则失败,返回-1.
在root用户下创建的程序,网卡也设置为混杂模式,找不到错误,求大神指导。

1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包
2.socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧
3.socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧(不包括以太网头部)_