我是靠谱客的博主 超帅铃铛,最近开发中收集的这篇文章主要介绍linux tcp 截获 rawsocket,linux内核构造skb发包-----raw、tcp网络编程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 内核raw发包

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

struct sk_buff *skb;

int _send_raw_skb(unsigned char *mac1) {

struct net_device * mdev = NULL;

struct ethhdr *eth;

unsigned char *data;

int dlen, i;

unsigned char mac[10]={'1','2','3','a','b','c'};

/*

*Allocate a buffer

*/

dlen = 6+sizeof(struct ethhdr);

skb = alloc_skb(dlen, GFP_ATOMIC);

if (skb == NULL)

return -1;

skb_reserve(skb, dlen);

mdev = dev_get_by_name(&init_net, "ens33");

if(mdev == NULL)

{

printk("get dev errorn");

return -1;

}

skb->dev = mdev;

skb->protocol = htons(ETH_P_PAE);

memcpy(skb_push(skb,6),mac,6);

skb_push(skb,sizeof(struct ethhdr));

eth = (struct ethhdr *)skb->data;

memcpy(eth->h_source, skb->dev->dev_addr, 6);

memset(eth->h_dest, 0xff, 6);

eth->h_proto = htons(ETH_P_PAE);

dev_queue_xmit(skb);

return 0;

}

static int test_init(void) {

printk("%sn", __FUNCTION__);

_send_raw_skb(NULL);

return 0;

}

static void test_exit(void) {

printk("%sn", __FUNCTION__);

dev_put(skb->dev);

}

module_init(test_init);

module_exit(test_exit);

MODULE_LICENSE("GPL");

2. tcp发包(以client端为例,测试时可以用nc -l -p 8888做为server)

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE 1024

int connect_send_recv(void){

struct socket *sock;

struct sockaddr_in s_addr;

unsigned short port_num = 8888;

int ret = 0;

char *send_buf = NULL;

char *recv_buf = NULL;

struct kvec send_vec, recv_vec;

struct msghdr send_msg, recv_msg;

/* kmalloc a send buffer*/

send_buf = kmalloc(BUFFER_SIZE, GFP_KERNEL);

if (send_buf == NULL) {

printk("client: send_buf kmalloc error!n");

return -1;

}

/* kmalloc a receive buffer*/

recv_buf = kmalloc(BUFFER_SIZE, GFP_KERNEL);

if(recv_buf == NULL){

printk("client: recv_buf kmalloc error!n");

return -1;

}

memset(&s_addr, 0, sizeof(s_addr));

s_addr.sin_family = AF_INET;

s_addr.sin_port = htons(port_num);

s_addr.sin_addr.s_addr = in_aton("192.168.12.129");

sock = (struct socket *)kmalloc(sizeof(struct socket), GFP_KERNEL);

// 创建一个sock, &init_net是默认网络命名空间

ret = sock_create_kern(&init_net, AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);

if (ret < 0) {

printk("client:socket create error!n");

return ret;

}

printk("client: socket create ok!n");

//连接

ret = sock->ops->connect(sock, (struct sockaddr *)&s_addr, sizeof(s_addr), 0);

if (ret != 0) {

printk("client: connect error!n");

return ret;

}

printk("client: connect ok!n");

memset(send_buf, 'a', BUFFER_SIZE);

memset(&send_msg, 0, sizeof(send_msg));

memset(&send_vec, 0, sizeof(send_vec));

send_vec.iov_base = send_buf;

send_vec.iov_len = BUFFER_SIZE;

// 发送数据

ret = kernel_sendmsg(sock, &send_msg, &send_vec, 1, BUFFER_SIZE);

if (ret < 0) {

printk("client: kernel_sendmsg error!n");

return ret;

} else if(ret != BUFFER_SIZE){

printk("client: ret!=BUFFER_SIZE");

}

printk("client: send ok!n");

memset(recv_buf, 0, BUFFER_SIZE);

memset(&recv_vec, 0, sizeof(recv_vec));

memset(&recv_msg, 0, sizeof(recv_msg));

recv_vec.iov_base = recv_buf;

recv_vec.iov_len = BUFFER_SIZE;

// 接收数据

ret = kernel_recvmsg(sock, &recv_msg, &recv_vec, 1, BUFFER_SIZE, 0);

printk("client: received message:n %sn", recv_buf);

// 关闭连接

kernel_sock_shutdown(sock, SHUT_RDWR);

sock_release(sock);

return 0;

}

static int client_example_init(void){

printk("client: initn");

connect_send_recv();

return 0;

}

static void client_example_exit(void){

printk("client: exit!n");

}

module_init(client_example_init);

module_exit(client_example_exit);

MODULE_LICENSE("GPL");

【Linux网络编程】TCP网络编程中connect&lpar;&rpar;、listen&lpar;&rpar;和accept&lpar;&rpar;三者之间的关系

[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

Linux下TCP网络编程与基于Windows下C&num;socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

JAVA TCP网络编程学习笔记

一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

简述TCP网络编程本质

基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...

TCP网络编程

TCP网络编程  与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /**     * @param args     * @th ...

Java - TCP网络编程

Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

8-2udp和tcp网络编程以及粘包和解决粘包的方法

一  tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...

【Linux 网络编程】TCP网络编程中connect&lpar;&rpar;、listen&lpar;&rpar;和accept&lpar;&rpar;三者之间的关系

基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

TCP网络编程小结

一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...

随机推荐

java 心得

11. 最后的笑声 package javaBookPractice; public class LastLaugh { public static void main(String[] args) ...

Amoeba-mysql读写分离实战

Amoeba-mysql读写分离实战 Amoeba用途有很多,这里看标题我们就先说读写分离,因为我也只会这个.Amoeba定义为国内的,开源的.目前(2015年10月20日)我们用amoeba2.2版 ...

JavaMail邮件开发

一.只带有纯文本的邮件 代码事例如下: package com.lyh.sendemail; import java.util.Properties; import javax.mail.Messag ...

c&num;网络通信框架networkcomms内核解析 序言

NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...

&lbrack;转载&rsqb;C&num;对象序列化与反序列化

文章写的实在是太好了,忍不住转来: http://www.cnblogs.com/LiZhiW/p/3622365.html#_Toc8478 1.对象序列化的介绍 (1).NET支持对象序列化的几种 ...

js的map方法遍历数组

map方法有返回值,返回值用变量接收. 例子: var num = [1, 2, 3]; var newNum = num.map((ele, index) => { return ele + ...

表连接join on

表A记录如下:  aID aNum  1 a20050111  2 a20050112  3 a20050113  4 a20050114  5 a20050115  表B记录如下:  bID bNa ...

P1067 多项式输出

#include #include#includeusing namespace std;int a[10 ...

python 判断字符串中字符类型的常用方法

s为字符串 s.isalnum() 所有字符都是数字或者字母 s.isalpha() 所有字符都是字母 s.isdigit() 所有字符都是数字 s.islower() 所有字符都是小写 s.isup ...

Mycat分片规则详解

1.分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下:

最后

以上就是超帅铃铛为你收集整理的linux tcp 截获 rawsocket,linux内核构造skb发包-----raw、tcp网络编程的全部内容,希望文章能够帮你解决linux tcp 截获 rawsocket,linux内核构造skb发包-----raw、tcp网络编程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部