Tcp 我们是否应该将整个数据包(报头、校验和等)框起来使用netmap?

Tcp 我们是否应该将整个数据包(报头、校验和等)框起来使用netmap?,tcp,network-programming,Tcp,Network Programming,我对netmap很感兴趣,它允许用户程序员访问用户空间中的数据包,这意味着用户应用程序可以使用此netmap非常快速地读取/发送网络数据包 网络地图: 任何一位非常熟悉netamp的人都可以告诉我,我们应该创建要发送的整个数据包,还是使用堆栈功能发送数据包 编辑:下面是关于如何使用此api的示例 #包括 无效发送者(无效) { 结构netmap_if*nifp; 结构netmap_环*环; 结构nmreq-nmr; 结构pollfd-fds; fd=打开(“/dev/netmap”,O_RD

我对netmap很感兴趣,它允许用户程序员访问用户空间中的数据包,这意味着用户应用程序可以使用此netmap非常快速地读取/发送网络数据包

网络地图:

任何一位非常熟悉netamp的人都可以告诉我,我们应该创建要发送的整个数据包,还是使用堆栈功能发送数据包

编辑:下面是关于如何使用此api的示例

#包括
无效发送者(无效)
{
结构netmap_if*nifp;
结构netmap_环*环;
结构nmreq-nmr;
结构pollfd-fds;
fd=打开(“/dev/netmap”,O_RDWR);
bzero(&nmr,sizeof(nmr));
strcpy(nmr.nr_名称,“ix0”);
nmr.nm_version=NETMAP_API;
ioctl(fd、NIOCREGIF和nmr);
p=mmap(0,nmr.nr_memsize,fd);
nifp=网络映射IF(p,nmr.nr\u偏移量);
环=NETMAP_TXRING(nifp,0);
fds.fd=fd;
fds.events=轮询;
对于(;;){
投票表决(&fds,1,-1);
而(!nm_环_空(环)){
i=环->电流;
buf=NETMAP\u buf(环,环->槽[i].buf\u索引);
//这里他们说的是构造数据包
…准备buf中的数据包。。。
环->插槽[i]。len=…数据包长度。。。
环->头=环->电流=nm\u环\u下一个(环,i);
}
}
}

您需要创建整个打包包,包括以太网、ip和tcp头。Netmap完全绕过内核网络堆栈,所以您需要自己完成所有工作

     #include <net/netmap_user.h>
 void sender(void)
 {
 struct netmap_if *nifp;
 struct netmap_ring *ring;
 struct nmreq nmr;
 struct pollfd fds;

 fd = open("/dev/netmap", O_RDWR);
 bzero(&nmr, sizeof(nmr));
 strcpy(nmr.nr_name, "ix0");
 nmr.nm_version = NETMAP_API;
 ioctl(fd, NIOCREGIF, &nmr);
 p = mmap(0, nmr.nr_memsize, fd);
 nifp = NETMAP_IF(p, nmr.nr_offset);
 ring = NETMAP_TXRING(nifp, 0);
 fds.fd = fd;
 fds.events = POLLOUT;
 for (;;) {
     poll(&fds, 1, -1);
     while (!nm_ring_empty(ring)) {
     i = ring->cur;
     buf = NETMAP_BUF(ring, ring->slot[i].buf_index);

     // here they are saying to construct the packet

     ... prepare packet in buf ...
     ring->slot[i].len = ... packet length ...
     ring->head = ring->cur = nm_ring_next(ring, i);
     }
 }
 }