Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用本机C进行IPv6原始套接字编程

用本机C进行IPv6原始套接字编程
EN

Stack Overflow用户
提问于 2011-11-02 04:50:36
回答 2查看 10.2K关注 0票数 2

我正在IPv6上工作,需要从头开始制作一个IPv6包,并将其放入缓冲区。不幸的是,我对C没有太多的经验。在一个教程中,我通过定义IPv4成功地完成了同样的工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ipheader {
 unsigned char      iph_ihl:5, /* Little-endian */
                iph_ver:4;
 unsigned char      iph_tos;
 unsigned short int iph_len;
 unsigned short int iph_ident;
 unsigned char      iph_flags;
 unsigned short int iph_offset;
 unsigned char      iph_ttl;
 unsigned char      iph_protocol;
 unsigned short int iph_chksum;
 unsigned int       iph_sourceip;
 unsigned int       iph_destip;
};

/* Structure of a TCP header */
struct tcpheader {
 unsigned short int tcph_srcport;
 unsigned short int tcph_destport;
 unsigned int       tcph_seqnum;
 unsigned int       tcph_acknum;
 unsigned char      tcph_reserved:4, tcph_offset:4;
 // unsigned char tcph_flags;
  unsigned int
       tcp_res1:4,       /*little-endian*/
       tcph_hlen:4,      /*length of tcp header in 32-bit words*/
       tcph_fin:1,       /*Finish flag "fin"*/
       tcph_syn:1,       /*Synchronize sequence numbers to start a connection*/
       tcph_rst:1,       /*Reset flag */
       tcph_psh:1,       /*Push, sends data to the application*/
       tcph_ack:1,       /*acknowledge*/
       tcph_urg:1,       /*urgent pointer*/
       tcph_res2:2;
 unsigned short int tcph_win;
 unsigned short int tcph_chksum;
 unsigned short int tcph_urgptr;
};

然后像这样填写数据包内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// IP structure
   ip->iph_ihl = 5;
   ip->iph_ver = 6;
   ip->iph_tos = 16;
   ip->iph_len = sizeof (struct ipheader) + sizeof (struct tcpheader);
   ip->iph_ident = htons(54321);
   ip->iph_offset = 0;
   ip->iph_ttl = 64;
   ip->iph_protocol = 6; // TCP
   ip->iph_chksum = 0; // Done by kernel

   // Source IP, modify as needed, spoofed, we accept through command line argument
   ip->iph_sourceip = inet_addr("1922.168.1.128");
   // Destination IP, modify as needed, but here we accept through command line argument
   ip->iph_destip = inet_addr(1922.168.1.1);

   // The TCP structure. The source port, spoofed, we accept through the command line
   tcp->tcph_srcport = htons(atoi("1024"));
   // The destination port, we accept through command line
   tcp->tcph_destport = htons(atoi("4201"));
   tcp->tcph_seqnum = htons(1);
   tcp->tcph_acknum = 0;
   tcp->tcph_offset = 5;
   tcp->tcph_syn = 1;
   tcp->tcph_ack = 0;
   tcp->tcph_win = htons(32767);
   tcp->tcph_chksum = 0; // Done by kernel
   tcp->tcph_urgptr = 0;
   // IP checksum calculation
   ip->iph_chksum = csum((unsigned short *) buffer, (sizeof (struct ipheader) + sizeof (struct tcpheader)));

然而,对于IPv6,我没有找到类似的方法。我已经发现了IETF的这个结构,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ip6_hdr {

   union {

      struct ip6_hdrctl {
         uint32_t ip6_un1_flow; /* 4 bits version, 8 bits TC, 20 bits
                                      flow-ID */
         uint16_t ip6_un1_plen; /* payload length */
         uint8_t ip6_un1_nxt; /* next header */
         uint8_t ip6_un1_hlim; /* hop limit */
      } ip6_un1;

      uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits
                                      tclass */
   } ip6_ctlun;
   struct in6_addr ip6_src; /* source address */
   struct in6_addr ip6_dst; /* destination address */
};

但我不知道如何填写信息,例如,如何发送TCP/SYN从2001年:220:806:22:aacc:ff:fe00:1端口1024到2001年:220:806:21:4端口1025?

有人能帮我吗?或者有什么推荐信?

那么非常感谢您。

这就是我到目前为止所做的工作,但是代码和Wireshark捕获的实际数据包之间存在不匹配(如下面的注释中所讨论的)。我不确定是否有可能在评论部分张贴一个长代码,所以我只是编辑我的问题。

有人能帮忙吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define PCKT_LEN 2000

int main(void) {
   unsigned char buffer[PCKT_LEN];
   int s;
   struct sockaddr_in6 din;
   struct ipv6_header *ip = (struct ipv6_header *) buffer;
   struct tcpheader *tcp = (struct tcpheader *) (buffer + sizeof (struct ipv6_header));

   memset(buffer, 0, PCKT_LEN);
   din.sin6_family = AF_INET6;
   din.sin6_port = htons(0);
   inet_pton(AF_INET6, "::1", &(din.sin6_addr)); // For routing 

   ip->version = 6;
   ip->traffic_class = 0;
   ip->flow_label = 0;
   ip->length = 40;
   ip->next_header = 6;
   ip->hop_limit = 64;
   inet_pton(AF_INET6, "::1", &(ip->dst)); // IPv6 
   inet_pton(AF_INET6, "::1", &(ip->src)); // IPv6

   tcp->tcph_srcport = htons(atoi("11111"));
   tcp->tcph_destport = htons(atoi("13"));
   tcp->tcph_seqnum = htons(0);
   tcp->tcph_acknum = 0;
   tcp->tcph_offset = 5;
   tcp->tcph_syn = 1;
   tcp->tcph_ack = 0;
   tcp->tcph_win = htons(32752);
   tcp->tcph_chksum = 0; // Done by kernel
   tcp->tcph_urgptr = 0;

   s = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW);
   if (s < 0) {
      perror("socket()");
      return 1;
   }
   unsigned short int packet_len = sizeof (struct ipv6_header) + sizeof (struct tcpheader);
   if (sendto(s, buffer, packet_len, 0, (struct sockaddr*) &din, sizeof (din)) == -1) {
      perror("sendto()");
      close(s);
      return 1;
   }
   close(s);
   return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2011-11-02 04:56:13

也许文章可以帮助您入门?

编辑:使用上面链接的维基百科文章创建了这个结构(不知道其中一些字段的含义):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ipv6_header
{
    unsigned int
        version : 4,
        traffic_class : 8,
        flow_label : 20;
    uint16_t length;
    uint8_t  next_header;
    uint8_t  hop_limit;
    struct in6_addr src;
    struct in6_addr dst;
};

这与在您的示例中如何为IPv4创建头-结构没有什么不同。只需按照正确的顺序和大小创建一个包含字段的struct,并用正确的值填充它。

只需对TCP头执行同样的操作。

票数 2
EN

Stack Overflow用户

发布于 2017-10-31 06:26:04

不幸的是,ipv6 RFC没有提供与ipv4相同的原始套接字接口。据我所见,创建ipv6数据包时,您必须更进一步,使用AF_PACKET套接字发送以太网帧,包括您的ipv6数据包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7980585

复制
相关文章
Axios 取消重复请求
项目地址:https://github.com/Ewall1106/mall 有什么用? 当用户频繁点击在短时间内发送多个 ajax 请求,但是由于网络原因服务器数据无法及时响应返回,这时候,就会有可能造成前端页面数据不匹配的情况。 具体场景来说,在用户网速不好的情况下的比如搜索框 onchange 事件的模糊搜索、触底刷新请求列表数据、tab 栏的高频切换等等。 再者,这样也浪费服务器资源,也是性能优化的一种必要手段。 基本使用 官网地址:Axios-CancelToken 官网的基本示例如下。 c
Ewall
2020/11/12
1.5K0
如何优雅处理重复请求/并发请求?
一些用户请求在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些涉及写入操作,一旦重复了,可能会导致很严重的后果。例如交易接口如果重复请求,可能会重复下单。
java进阶架构师
2021/07/08
4.8K1
如何优雅处理重复请求/并发请求?
优雅地处理重复请求(并发请求)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/24
9970
如何优雅地处理重复请求(并发请求)
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。 重复的场景有可能是: 黑客拦截了请求,重放 前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了 网关重发 …. 本文讨论的是如何在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。 利用唯一请求编号去重 可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去
程序猿DD
2022/04/11
5760
如何优雅地处理重复请求(并发请求)
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。
用户1263954
2022/05/23
1.1K0
如何优雅地处理重复请求(并发请求)
如何优雅地处理重复请求(并发请求)
你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的
用户2781897
2020/12/15
1.4K0
LeetCode - 重复 N 次的元素
原题地址:https://leetcode-cn.com/problems/n-repeated-element-in-size-2n-array/
晓痴
2019/08/06
7650
LeetCode - 重复 N 次的元素
webapi避免http重复请求
route过滤 添加路由过滤,在过滤器中判断sessionid或者cookie session session服务端文件,存储guid或者用户账户(操作简单,增加服务器压力) session管理参考:https://www.cnblogs.com/wxdlut/p/9237577.html cookie cookie浏览器端,浏览器请求附带cookie,cookie设置超时管理连接状态) 路由过滤实现方式 golang gin.Default().Use(func() gin.HandlerFunc{
sofu456
2021/12/06
8970
封装 axios 取消重复请求
在我们web开发过程中,很多地方需要我们取消重复的请求。但是哪种场合需要我们取消呢?我们如何取消呢?带着这些问题我们阅读本文。
coder_koala
2021/01/06
1.7K0
ExcelVBA生成不重复n位的n个数字
'使用方法:call rnd_n_n(位数,个数,存放位置)如:Call rnd_n_n(10, 100, "a1")
哆哆Excel
2022/10/25
4460
ExcelVBA随机生成不重复的N个N位数文本
效果看图 【代码】 自定义函数1 '随机生成不重复指定位数文本,用法:brr=RndDigitText(位数, 个数) '.range("A1").Resize(UBound(brr), 1) = brr Function RndDigitText(di As Integer, number As Integer) Dim d As Object 'New Dictionary
哆哆Excel
2022/10/31
5080
961. 重复 N 次的元素
在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。 返回重复了 N 次的那个元素。
Michel_Rolle
2021/02/25
2.5K0
java防止接口重复请求_前端防止重复提交
对于一些新增数据的接口通常需要进行接口的防重复提交保护,如:用户账号注册、用户下单、用户发帖等等类似的应用场景。 防重复提交主要应用场景是避免用户短时间内由于误操作导致同一份数据被保存多次所带来的问题,如果被保存的数据内容存在唯一标识限制则可以选择不使用防重复提交,在业务侧保证数据的唯一性即可。 注意:防重复提交只能防止短时间内用户的误操作导致插入重复数据的问题,如果需要数据的唯一性还是需要在业务中自行处理。
全栈程序员站长
2022/09/27
2K0
AJAX请求重复发送问题
在进行 AJAX(Asynchronous JavaScript and XML)请求时,我们有时会遇到请求重复发送的问题。这可能会导致不必要的请求重复执行,增加服务器负载和网络带宽消耗,并且可能对应用程序的性能和用户体验产生不良影响。
堕落飞鸟
2023/05/18
1.2K0
Axios使用CancelToken取消重复请求
处理重复请求:没有响应完成的请求,再去请求一个相同的请求,会把之前的请求取消掉
明知山
2023/08/18
4020
Axios使用CancelToken取消重复请求
SpringBoot如何处理重复请求?
日常业务开发中,处理重复请求应该是我们需要经常注意的,那么在Spring Boot中,防止重复请求的方法可以通过以下几种方式实现:
跟着可乐学技术
2023/04/27
9470
get 和 post 重复请求详解
适用于频繁触发并且需要给予用户一些反馈的场景,如:resize、scroll、mousemove
ruochen
2021/12/16
3.5K0
使用Vagrant在几秒钟内调试内核
所有Windows内核黑客(从初学者到专业人士)都知道,设置和管理用于内核调试的虚拟机可能很耗时。Vagrant是一个免费的开源工具,可以自动创建和自动化VM。这篇文章将向您介绍Vagrant,以及如何利用其功能自动执行我们的内核调试设置。
franket
2021/01/05
2.9K0
使用原生 JavaScript 在页面加载完成后处理多个函数
网页中的 JavaScript 脚本运行是需要通过事件去触发的。一般的做法就是在网页中,直接编写几个函数,有的在代码被加载的时候就被浏览器处理,或者使用类似下面的代码来触发实现函数的相关功能。
Denis
2023/04/15
2.8K0
iOS多个网络请求完成后执行下一步
在开发中,我们很容易遇到这样的需求,需要我们同时做多个网络请求,所有网络请求都完成后才能进行下一步的操作。如下载多个图片,下载完了才能展示。 今天我们就来研究一下这个问题的解决方案。 1.首先,我们创建一个项目,然后做一般性的做法,不做任何处理去连续请求一个接口10次: 先在viewDidLoad中创建第一种情况. //1.无处理 UIButton *Btn1 = [UIButton buttonWithType:UIButtonTypeCustom]; Btn1.frame = CGRec
清墨
2018/05/07
3K0

相似问题

重复bash命令n秒钟

22

RXJava + Retrofit.每n秒钟重复请求一次

16

重复函数执行n秒钟

44

如何每N秒钟重复运行bash脚本?

28

angular2调用http.get请求打开文件

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文