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

重新设置。。

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐