首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Windows中的原始套接字实现?

在Windows系统中,原始套接字(Raw Sockets)允许用户直接发送和接收IP数据包,绕过常规的网络协议栈处理。这在某些特定场景下非常有用,比如进行网络诊断、嗅探或安全研究。然而,需要注意的是,在Windows系统中使用原始套接字需要管理员权限,并且受到一些限制。

以下是在Windows中使用原始套接字的基本步骤:

  1. 包含必要的头文件: 在C或C++程序中,你需要包含以下头文件:
代码语言:javascript
复制
#include <winsock2.h>
#include <iphlpapi.h>
#include <ws2tcpip.h>
  1. 初始化Winsock: 在使用原始套接字之前,必须初始化Winsock库。这通常通过调用WSAStartup函数来完成。
代码语言:javascript
复制
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0) {
    printf("WSAStartup failed: %d\n", result);
    return 1;
}
  1. 创建原始套接字: 使用socket函数创建一个原始套接字。指定AF_INET表示IPv4,SOCK_RAW表示原始套接字类型,以及IPPROTO_IP表示对IP数据包感兴趣。
代码语言:javascript
复制
SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (sock == INVALID_SOCKET) {
    printf("socket failed: %d\n", WSAGetLastError());
    WSACleanup();
    return 1;
}
  1. 设置原始套接字选项(可选): 你可以使用setsockopt函数设置原始套接字的选项,比如过滤特定的协议或IP地址。
  2. 发送和接收数据包: 使用sendrecv函数发送和接收原始IP数据包。注意,发送的数据包需要包含完整的IP头部。
  3. 关闭套接字和清理: 完成操作后,使用closesocket关闭套接字,并使用WSACleanup清理Winsock库。
代码语言:javascript
复制
closesocket(sock);
WSACleanup();
  1. 编译和运行: 确保以管理员权限编译和运行程序,因为Windows要求使用原始套接字的程序必须具有管理员权限。
  2. 注意事项
  • Windows系统的原始套接字功能比Linux更为受限。例如,你不能直接发送TCP或UDP数据包,而只能发送和接收原始的IP数据包。
  • 由于安全原因,某些版本的Windows可能会进一步限制原始套接字的使用。
  • 确保你了解并遵守相关的网络安全法律和规定,以避免滥用。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go中原始套接深度实践

介绍 原始套接(raw socket)是一种网络套接,允许直接发送/接收更底层数据包而不需要任何传输层协议格式。...平常我们使用较多套接(socket)都是基于传输层,发送/接收数据包都是不带TCP/UDP等协议头部。...如果想自己封装头部或定义协议的话,就需要使用原始套接,直接向网络层发送数据包。 为了便于后面理解,这里统一称应用数据为 payload,协议头部为 header,套接为socket。...其他 第二个参数 syscall.SOCK_RAW,表示使用原始套接,可以构建传输层协议头部,启用IP_HDRINCL的话,IP层协议头部也可以构造,就是上面区分传输层socket和网络层socket...也可以伪装IP去DDOS别人,但基于安全考虑:Windows并不允许通过Raw socket去发送TCP数据,UDP源IP也必须在本地网络接口中能找到才行,监听TCP流量也是不允许

3K20
  • 原始套接 IP_HDRINCL 转

    原始套接可以访问ICMP和ICMP等协议包,可以读写内核不处理IP数据包。可以创建自定义IP数据包首部。一句话,使用原始套接可以   编写基于IP协议通讯程序。   ...IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接可以接收内核传递给原始套接任何IP数据包,且只有超级用户才可以创建原始套接。   ...接收数据包   内核遵循以下规则接收数据包:1.UDP和TCP数据包从不传送给一个原始套接。如果要查看这两类数据包,只能通过直接访问数据链路层来实现。   ...2.大多数ICMP数据包一个拷贝传送给匹配原始套接。   3.内核处理所有其它类型数据包一个拷贝都传给匹配原始套接。   ...在将一个IP数据包传送给原始套接之前,内核需要选择匹配原始套接1.数据包协议域必须与接收原始套接协议类型匹配。

    2.4K10

    原始套接和流量嗅探

    书是比较老了,anyway,还是本很好书 本篇是第3章原始套接和流量嗅探 1、Windows和Linux上包嗅探 为了多平台使用,先创建SOCKET,再判断平台 windows允许嗅探所有协议 linux...,大概就是原始套接意思吧 sniffer.bind((host, 0)) #这里端口为0,监听所有端口吧~ # 设置在捕获数据包包含IP头 sniffer.setsockopt(socket.IPPROTO_IP...,大概就是原始套接意思吧 sniffer.bind((host, 0)) #这里端口为0,监听所有端口吧~ # 设置在捕获数据包包含IP头 sniffer.setsockopt(socket.IPPROTO_IP...,大概就是原始套接意思吧 sniffer.bind((host, 0)) #这里端口为0,监听所有端口吧~ # 设置在捕获数据包包含IP头 sniffer.setsockopt(socket.IPPROTO_IP...,大概就是原始套接意思吧 sniffer.bind((host, 0)) #这里端口为0,监听所有端口吧~ # 设置在捕获数据包包含IP头 sniffer.setsockopt(socket.IPPROTO_IP

    1.8K20

    golang使用原始套接构造UDP包

    RAW SOCKET 介绍 TCP/IP协议,最常见就是原始(SOCKET_RAW)、tcp(SOCKET_STREAM)、udp(SOCKET_DGRA)三种套接。...原始套接能够对底层传输进行控制,允许自行组装数据包,比如修改本地IP,发送Ping包,进行网络监听。这里不做详细介绍,要了解更多可以网上自己查询。...实现 这里先看IP头结构: 其中16位总长度包括IP头长度和数据长度,8位协议填写17,因为UDP协议类型为17。这里要说明一下IP头中首部校验,这个值只校验IP头部,不包含数据。...= nil { log.Fatal(err) } 这个实现只在linux和mac上测试过,windows上需要借助于第三方吧,比如winpcap。...结语 这里只给出了UDP实现,TCP实现比较复杂,以后也会给出TCP实现例子。 本文来自:Segmentfault 感谢作者:pinecone 查看原文:golang使用原始套接构造UDP包

    3.4K50

    C实现TCP套接

    如何在C实现TCP套接 最近一直出差,大家不好意思。文章更新有点慢,希望大家包涵!!谢谢!!!今天讲工业现在用到最多通讯协议。 TCP套接用于服务器和客户端进程之间通信。...return 0; } 解释 包括头文件sys/socket.h和arpa/inet.h: #include #include 创建一个返回套接描述符套接...;稍后将在代码中使用它来引用套接: int socket_desc = socket(AF_INET, SOCK_STREAM, 0); 服务器端代码保持在所述服务器和类型变量客户机两者地址信息..., 1); 通过接受传入连接来存储客户端地址和套接描述符: struct sockaddr client_addr; int client_size = sizeof(client_addr);...服务器回复“这是服务器消息”,并且通信终止。 指示 1、单击下面的小部件“运行”按钮,然后执行服务器命令。如果成功创建了套接,将显示消息“正在侦听传入连接…”。

    96520

    《Python黑帽子》:原始套接和流量嗅探

    在本文中,我们将使用原始套接来访问诸如IP 和ICMP 头等底层网络信息。在下面的例子,我们只对IP 层和更高层感兴趣,因此我们不会去解码以太网头中信息。...Windows 和Linux 上包嗅探 在Windows 和Linux 上访问原始套接有些许不同,但我们更中意于在多平台部署同样嗅探器以实现更大灵活性。...我们将先创建套接对象,然后再判断程序在哪个平台上运行。在Windows 平台上,我们需要通过套接输入/输出控制(IOCTL)1设置一些额外标志,它允许在网络接口上启用混杂模式。...在第一个例子,我们只需设置原始套接嗅探器,读取一个数据包,然后退出即可。 首先,我们通过构建套接对象对网络接口上数据包嗅探进行必要参数设置①。...然后,我们通过设置套接选项②设置在捕获数据包包含IP 头。下一步③,我们判断程序是否运行在Windows 上,如果是,那么我们发送IOCTL 信号到网卡驱动上以启用混杂模式。

    1.3K20

    Windows 网络通信套接技术

    基本套接 3、典型过程图 三、Windows Socket 程序设计 1、Windows Socket网络程序设计核心 2、WinSock编程基本流程 WinSock API提供了几个函数: 下面是一个最简单创建服务器端和客户端例子...用户服务要通过核外应用程序才能实现,所以要使用套接(socket)来实现。 TCP/IP协议核心与应用程序关系如图所示。...二、套接原理 1、客户机/服务器模式 在TCP/IP网络两个进程间相互作用主机模式是客户机/服务器模式 (Client/Server model)。...然后必须创建一个套接(Socket),使用函数: SOCKET Socket(int af,int type,int protocol)。 来实现套接可以说是WinSock通讯核心。...WinSock通讯所有数据传输, 都是通过套接来完成套接包含了两个信息,一个是IP地址,一个是Port 端口号,使用这两个信息,就可以确定网络任何一个通讯节点。

    77330

    Go链路层套接实践

    如果校验错误,直接丢弃掉,不会送到上层协议栈,链路层只保证数据帧正确性(丢掉错误)。具体数据报完整性由上层控制,比如TCP重传。...链路层最大长度是1518节,除去18头部和尾部,只剩1500节,也就是MTU(最大传输单元)由来,并约定最小传输长度64节。 2....拿到网络接口设备详细信息,eth0是上面的网络设备名字: ifi, err := net.InterfaceByName("eth0") util.CheckError(err) 然后使用原始套接绑定到该网络设备上...第三个则对应头部协议类型(ehter type),比如只接收 IP 协议数据,也可以接收所有的。可在Linuxif_ether文件查看相应值。...协议尾部4节不需要处理,在发送数据时候由网络设备并添加,接收时候由设备校验并去除。在以前有些计算机,是需要自己添加或移除尾部,后面可介绍下该校验算法。

    1.7K20

    Windows套接CAsyncSocket类使用「建议收藏」

    大家好,又见面了,我是你们朋友全栈君。...TCP编程服务器端一般步骤是: 1、创建一个CAsyncSocket或CSocket类或其子类对象A,用于监听客户端连接,然后通过Create函数设定端口号和协议类型为 SOCK_STREAM。...2、开启监听,用函数Listen(); 3、接收客户端上来连接,用函数Accept(&B);并且把连接连接对象存到B,以便通信使用。...6、关闭网络连接B.Close; 8、关闭监听A.Close; TCP编程客户端一般步骤是: 1、创建一个CAsyncSocket或CSocket类或其子类对象C,用Create函数设定端口号和协议类型为...: UDP编程服务器端与客户端过程一样,因为不需要建立监听和连接,所以一般步骤都是: 1、创建一个CAsyncSocket或CSocket类或其子类对象A,用于监听客户端连接,然后通过Create

    61820

    accept()返回套接绑定哪个端口 新旧套接联系

    参数sockfd  参数sockfd就是上面解释监听套接,这个套接用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接关联。...因为你要找那个人不可能随时等你来,而监听套接就是专职等你来问,它回答你要找的人在哪,并唤醒你要找的人,于是通话就建立起来了,就像现实生活接线员一样。...Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接接口,区分来自不同应用程序进程或网络连接通信,实现数据传输并发服务。...参数sockfd  参数sockfd就是上面解释监听套接,这个套接用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接关联。...Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接接口,区分来自不同应用程序进程或网络连接通信,实现数据传输并发服务。

    3.8K30

    C++ ASIO 实现异步套接管理

    图片本章笔者将介绍如何通过ASIO框架实现一个简单异步网络套接应用程序,该程序支持对Socket套接存储,默认将套接放入到一个Map容器内,当需要使用时只需要将套接在容器内取出并实现通信,客户端下线时则自动从...,不开放则说明服务端离线此处尝试等待一段时间后再次验证,在调用boost::bind()函数绑定套接时通过&AsyncConnect::timer_handle()函数来设置一个超时等待时间。...AsyncTcpServer头文件功能函数,此功能函数实现如果读者不明白原理可自行将其提交给ChatGPT解析,这里就不再解释功能了。...,当我们需要发送数据时,只需要将数据字符串放入到一个BYTE*字节数组,并在调用tcpServer.Send时将所需参数,套接ID,缓冲区Buf数据,以及长度传递即可实现将数据发送给指定客户端;/...;图片当用户需要通信时,只需要指定id序号到指定Socket套接编号即可;图片本文作者: 王瑞本文链接: https://www.lyshark.com/post/d0805aed.html版权声明

    50220

    C++ ASIO 实现异步套接管理

    本章笔者将介绍如何通过ASIO框架实现一个简单异步网络套接应用程序,该程序支持对Socket套接存储,默认将套接放入到一个Map容器内,当需要使用时只需要将套接在容器内取出并实现通信,客户端下线时则自动从...,不开放则说明服务端离线此处尝试等待一段时间后再次验证,在调用boost::bind()函数绑定套接时通过&AsyncConnect::timer_handle()函数来设置一个超时等待时间。...AsyncTcpServer头文件功能函数,此功能函数实现如果读者不明白原理可自行将其提交给ChatGPT解析,这里就不再解释功能了。...,当我们需要发送数据时,只需要将数据字符串放入到一个BYTE*字节数组,并在调用tcpServer.Send时将所需参数,套接ID,缓冲区Buf数据,以及长度传递即可实现将数据发送给指定客户端;...; 当用户需要通信时,只需要指定id序号到指定Socket套接编号即可; 本文作者: 王瑞 本文链接: https://www.lyshark.com/post/d0805aed.html

    28050

    Python实现TCP协议套接多路复用

    如果有同学已完成但老师还没问到他,就在座位上等着,老师仍按原来顺序逐个询问和检查,直到到达该同学时再检查他作业。容易得知,这样方式效率很低,并且资源极度浪费。...这样方式,每个同学作业可以立刻得到检查,但是每个分身功力都会比本体弱一点,并且每创建一个分身就会带走本体一部分能量值,这会对老师身体健康造成一定影响,如果创建太多分身会导致本体资源(CPU、...如果检查作业耗时较长,为避免学生等待时间过长,可以考虑创建几个分身,几个分身同时端坐于讲台之上,根据学生完成情况在机房内瞬移、穿梭。...================= Python标准库selector和selectors支持套接多路复用,使得可以在同一个线程监听多个套接IO请求。...模拟场景: 服务器同时接收和处理多个客户端发来数据,输出收到数据并向客户端发送确认信息。 服务端代码: ? 客户端代码: ? 运行情况: ? 多线程版本客户端代码: ? 运行情况: ?

    1K40

    Python网络编程套接名和DNS解析

    这一次要讲的是套接名和DNS,并且还会涉及到网络数据发送接受和网络错误发生和处理。下面说套接名,在创建和部署每个套接对象时总共需要做5个主要决定,主机名和IP地址是其中最后两个。...', 1088)) 可以看到我们指定了4个值,两个用来做对套接做配置,另外两个提供bind()调用所需要地址。...第2个参数就是套接类型,然后我们解释一下套接类型,尽管TCP和UDP是AFINET协议族特有的,但是套接接口设计者决定基于数据报套接这一宏观概念创建一些更通用名字,这就是SOCKDGRAM...至于更详细一些东西,可以看相关文档。 下面这段代码是把上面内容结合起来,设计了一个简单例子。下面是使用getaddrinfo()创建并连接套接。...解析邮箱域名是多数Python程序原始DNS查询一个应用。 下面拿邮箱域名解析规则RFC5321来说,如果存在MX记录,则必须尝试与SMTP来进行通信。

    3.4K70

    基于TCP协议套接编程

    在设计模式,Socket其实就是一个门面模式,它把复杂TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单接口就是全部,让Socket去组织数据,以符合指定协议。...注意:也有人将socket说成ip+port,ip是用来标识互联网一台主机位置,而port是用来标识这台机器上一个应用程序,ip地址是配置到网卡上,而port是应用程序开启,ip与port绑定就标识了互联网独一无二一个应用程序...s.getsockname() 当前套接地址 s.getsockopt() 返回指定套接参数 s.setsockopt() 设置指定套接参数 s.close() 关闭套接 4.面向锁套接...方法 用途 s.setblocking() 设置套接阻塞与非阻塞模式 s.settimeout() 设置阻塞套接操作超时时间 s.gettimeout() 得到阻塞套接操作超时时间 5....面向文件套接 方法 用途 s.fileno() 套接文件描述符 s.makefile() 创建一个与该套接相关文件 4.示例 1.服务端 import socket #1、买手机 phone

    82310

    浅谈原始套接 SOCK_RAW 内幕及其应用(port scan, packet sniffer, syn flood, icmp flood)

    buffer,对一般套接,如SOCK_STREAM, SOCK_DGRAM 来说,此时缓冲区只有user data,其他各层头部已经被去除,而对于SOCK_RAW 来说是IP head + IP...0 , &saddr , &saddr_size);     //Now process the packet     ProcessPacket(buffer , data_size); } 即创建原始套接...Error message : %s \n" , errno , strerror(errno));         exit(0);     } } 创建一个原始套接s,开启IP_HDRINCL 选项...另开一个线程创建另一个原始套接,仿照packet sniffer 进行数据包接收,分解tcp 头部看是否syn == 1 && ack == 1 && dest_addr == src_addr,...如果不追求效率,很简单做法是直接用普通套接,循环端口去connect,成功就表明端口是打开,只是三次握手完整了一回。

    3.6K00
    领券