req.tp_block_size=96;
req.tp_frame_size=96;
req.tp_block_nr=2;
req.tp_frame_nr=2;
if ( (setsockopt(fd,
SOL_PACKET,
PACKET_RX_RING,
(char *)&req,
sizeof(req))) != 0 ) {
perror("setsockopt()");
close(fd);
return 1;
};
/* mmap() the sucker */
map=mmap(NULL,
req.tp_block_size * req.tp_block_nr,
PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED, fd, 0);
如果帧的最小大小为 64,那么最后 4 个八位字节的 crc 是否由操作系统设置?如果我将帧大小设置为 60 而不设置 crc,它能在思科路由器和交换机之间成功传输吗?
上述最小设置可用于设置循环缓冲区(环)选项的分配:PACKET_TX_RING
示例 tp_block_size= 4096 // 连续块的最小大小 tp_frame_size= 2048 // 帧的大小 tp_block_nr= 4// 块的数量 tp_frame_nr= 8// 总帧数,冗余
4096/2048 = 2,2*4 = 8
tpacket_hdr 的大小是多少?tpacket_hdr 的大小是 32 字节 + 大小为 64 的帧吗?
最小 tp_frame_size 是多少?是 = 32+64 = 96
tp_block_size= 96 tp_frame_size= 96 tp_block_nr = 2 tp_frame_nr = 2
96/96 = 1,1*2 = 2
如果块的数量较少,是否可以有更好的性能?还是块越多越好?
如果每帧只有64个,有消息就立即发送 ret = sendto(sock, buffer, pkt_index->pktlen, MSG_DONTWAIT, (struct sockaddr *)(void *) to, sizeof(struct sockaddr_in));
- (回答不需要奖励)如何看出上面的应用和未应用的区别?