发送IP封包到高层协议

int ip_local_deliver(struct sk_buff *skb)
{
/*
* Reassemble IP fragments.
*/
struct net *net = dev_net(skb->dev);


if (ip_is_fragment(ip_hdr(skb))) {
if (ip_defrag(net, skb, IP_DEFRAG_LOCAL_DELIVER))
return 0;
}


return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN,
      net, NULL, skb, skb->dev, NULL,
      ip_local_deliver_finish);

}




struct rtable *rt_dst_alloc(struct net_device *dev,
   unsigned int flags, u16 type,
   bool nopolicy, bool noxfrm, bool will_cache)
{
struct rtable *rt;


rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
      (will_cache ? 0 : (DST_HOST | DST_NOCACHE)) |
      (nopolicy ? DST_NOPOLICY : 0) |
      (noxfrm ? DST_NOXFRM : 0));


if (rt) {
rt->rt_genid = rt_genid_ipv4(dev_net(dev));
rt->rt_flags = flags;
rt->rt_type = type;
rt->rt_is_input = 0;
rt->rt_iif = 0;
rt->rt_pmtu = 0;
rt->rt_gateway = 0;
rt->rt_uses_gateway = 0;
rt->rt_table_id = 0;
INIT_LIST_HEAD(&rt->rt_uncached);


rt->dst.output = ip_output;
if (flags & RTCF_LOCAL)
rt->dst.input = ip_local_deliver;
}


return rt;
}




static int ip_local_deliver_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
{
__skb_pull(skb, skb_network_header_len(skb));


rcu_read_lock();
{
int protocol = ip_hdr(skb)->protocol;
const struct net_protocol *ipprot;
int raw;


resubmit:
raw = raw_local_deliver(skb, protocol);


ipprot = rcu_dereference(inet_protos[protocol]);
if (ipprot) {
int ret;


if (!ipprot->no_policy) {
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
kfree_skb(skb);
goto out;
}
nf_reset(skb);
}
ret = ipprot->handler(skb);
if (ret < 0) {
protocol = -ret;
goto resubmit;
}
__IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
} else {
if (!raw) {
if (xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) {
__IP_INC_STATS(net, IPSTATS_MIB_INUNKNOWNPROTOS);
icmp_send(skb, ICMP_DEST_UNREACH,
 ICMP_PROT_UNREACH, 0);
}
kfree_skb(skb);
} else {
__IP_INC_STATS(net, IPSTATS_MIB_INDELIVERS);
consume_skb(skb);
}
}
}
 out:
rcu_read_unlock();


return 0;
}


static const struct net_protocol tcp_protocol = {
.early_demux = tcp_v4_early_demux,
.handler = tcp_v4_rcv,
.err_handler = tcp_v4_err,
.no_policy = 1,
.netns_ok = 1,
.icmp_strict_tag_validation = 1,
};


static const struct net_protocol udp_protocol = {
.early_demux = udp_v4_early_demux,
.handler = udp_rcv,
.err_handler = udp_err,
.no_policy = 1,
.netns_ok = 1,
};


static const struct net_protocol icmp_protocol = {
.handler = icmp_rcv,
.err_handler = icmp_err,
.no_policy = 1,
.netns_ok = 1,
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易语言是一种简单易学的编程语言,常用于快速开发简单的Windows应用程序。在易语言中,发送封包可以使用网络编程的相关函数来实现。 首先,需要使用Socket组件来建立与目标服务器的连接。使用Socket组件的open函数,可以指定目标服务器的IP地址和端口号,建立起与服务器的连接。然后,可以使用Socket组件的send函数来发送封包的数据。 发送封包的数据可以使用字符串来表示,字符串中包含了需要发送的数据的各个字段的值,可以根据需要添加分隔符。例如,可以使用逗号作为字段之间的分隔符,将各个字段的值连接起来,形成一个字符串。 在发送封包之前,需要先将字符串转换为字节数组。可以使用字符串的toBytes函数来实现这一转换。然后,可以使用Socket组件的sendBytes函数来发送字节数组。 发送封包的源码如下所示: ```python // 建立与服务器的连接 Socket.open("目标服务器IP地址", 端口号) // 构造封包数据字符串 数据字符串 = "字段1值,字段2值,字段3值..." // 将数据字符串转换为字节数组 数据字节数组 = 数据字符串.toBytes() // 发送封包数据 Socket.sendBytes(数据字节数组) // 关闭与服务器的连接 Socket.close() ``` 以上就是使用易语言发送封包的源码。通过建立与服务器的连接,构造封包数据字符串,将字符串转换为字节数组,再使用Socket组件发送字节数组,就可以成功发送封包数据。同时,记得在封包发送完成后,关闭与服务器的连接,释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值