关于netmap的环境安装以及简单示例
1 首先在ubuntu里面,需要把网卡的名字改成eth 类似这样的。vim /etc/default/grub找到GRUB_CMDLINE_LINUX=""改为GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"grub-mkconfig -o /boot/grub/grub.cfg2 安装netmaphttps://gitee.com/mirrors/
·
1 首先在ubuntu里面,需要把网卡的名字改成eth 类似这样的。
vim /etc/default/grub
找到GRUB_CMDLINE_LINUX=""
改为GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
grub-mkconfig -o /boot/grub/grub.cfg
2 安装netmap
https://gitee.com/mirrors/netmap.git
./configure
make && make install
insmod netmap.ko ##很重要。需要插入,相当于加载驱动的意思,每次重启都要加载一次
3 把操作系统的加载网瞳配置信息
vim /etc/network/interfaces
# 把ens33替换成eth0
改后:
如果用ifconfig 查不到网卡地址了,则重新设置一下
ifconfig eth0 192.168.1.107
test.c
#include <stdio.h>
#include <poll.h>
#define NETMAP_WITH_LIBS
#include <net/netmap_user.h>
unsigned long pps = 0;
static void receive_packets(struct netmap_ring *ring)
{
int i;
char *buf;
// 遍历所有的槽位
while (!nm_ring_empty(ring)) {
i = ring->cur;
buf = NETMAP_BUF(ring, ring->slot[i].buf_idx); // buf 就是收到的报文喽
pps++; // 统计收包个数
ring->head = ring->cur = nm_ring_next(ring, i); // 下一个槽位
}
}
//gcc -o test test.c -I/home/ntm/netmap/sys/ 注意这里是安装netmap的目录,请自行根据环境设置
int main(void)
{
struct nm_desc *d;
struct pollfd fds;
struct netmap_ring *ring;
int i;
d = nm_open("netmap:eth0", NULL, 0, 0); // 注意格式,netmap:ehtX
// d 的返回值我这里就不判断了
fds.fd = d->fd;
fds.events = POLLIN;
while (1) {
if (poll(&fds, 1, 1) < 0) {
perror("poll()");
exit(1);
}
// 遍历所有的接收队列
for (i = d->first_rx_ring; i <= d->last_rx_ring; i++) {
ring = NETMAP_RXRING(d->nifp, i);
receive_packets(ring); // 处理 ring
}
}
}
gcc -o test test.c -I/home/ntm/netmap/sys/ 注意这里是安装netmap的目录,请自行根据环境设置
编译通过。后面有空再讲讲netmap,以及单独自己实现的自己的tcp协议。。持续关注。。
有时网卡找不到,可以执行
ifconfig eth0 192.168.1.107
重新设置。。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)