为啥数据不通过 Windows 中的原始套接字发送

Posted

技术标签:

【中文标题】为啥数据不通过 Windows 中的原始套接字发送【英文标题】:Why is the data not sent over a raw socket in windows为什么数据不通过 Windows 中的原始套接字发送 【发布时间】:2021-12-08 14:44:41 【问题描述】:

我有通过原始套接字发送自建 udp 数据包的 python 代码。这适用于 Linux (Ubuntu),但不适用于 Windows (10)。

socket 是这样打开的:

#!/usr/bin/env python3

import argparse
import ipaddress
import socket
import struct
import sys

if __name__ == "__main__":
    sender = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)

    message = "myMessage"
    addr = ("127.0.0.1", 2001)

    message_encoded = message.encode()
    udp_msg = struct.pack("!HHHH"+str(len(message_encoded))+"s",
                          2002, addr[1], 8 + len(message_encoded),
                          0, message_encoded)
    ip_header = struct.pack("!BBHHHBBHLL",
                            4*16 + 5,
                            0,
                            20 + len(udp_msg),
                            12345,
                            0x0000,
                            255,
                            socket.IPPROTO_UDP,
                            0,
                            int(ipaddress.IPv4Address(addr[0])),
                            int(ipaddress.IPv4Address(addr[0])))
    data = ip_header + udp_msg
    print(data.hex())
    output_len = sender.sendto(data, addr)
    print("Sent message to :  ( bytes, total  bytes).".format(addr, message,
                len(message_encoded), output_len))

当我在 linux(使用 sudo)上运行此脚本时,消息会发送到侦听服务器,但当我在 Windows(具有管理权限)上运行它时,消息永远不会到达服务器。

【问题讨论】:

在 linux 上运行它(具有管理权限) - 你的意思是 Windows 吗? @11_22_33 是的,谢谢,现在改了 【参考方案1】:

禁止在 M$ Windows 10 上使用原始套接字。 Winpcap 及其后继 npcap 是一种解决方案。

【讨论】:

你有一个如何在python脚本中使用npcap的例子吗?

以上是关于为啥数据不通过 Windows 中的原始套接字发送的主要内容,如果未能解决你的问题,请参考以下文章

提升 asio 原始套接字

通过原始套接字发送源MAC和IP

python中的原始套接字和sendto

为啥打开wireshark抓包时没有发送ICMP ping请求?

通过 C 中的套接字传递结构

在windows系统中对套接字数据进行io时为啥不可以直接使用文件io相关函数?