📄 cantest.c
字号:
/* * cantest.c */#include <stdio.h> #include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#include <netinet/ip.h>#include <net/if.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <features.h> /* for the glibc version number */#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1#include <netpacket/packet.h>#include <net/ethernet.h> /* the L2 protocols */#else#include <asm/types.h>#include <linux/if_packet.h>#include <linux/if_ether.h> /* The L2 protocols */#endif#include "can.h"void can_show_header(struct can_frame_header *header){ printf("Header: id=%d srr=%d ide=%d eid=%d rtr=%d rb1=%d rb0=%d dlc=%d\n", header->id, header->srr, header->ide, header->eid, header->rtr, header->rb1, header->rb0, header->dlc);}intmain(int argc, char **argv){ int fd; int dummy; int ret; int len; int can_id = 1; struct sockaddr_ll ll,ll_recv; struct ifreq ifr; struct can_frame buf; struct can_frame frame = { .header = { .id = can_id, .srr = 0, .ide = 0, .eid = 0, .rtr = 0, .rb1 = 0, .rb0 = 0, .dlc = 8, }, .data = {'C','a','n','T','e','s','t',0}, }; if (argc != 2) { fprintf(stderr, "usage: %s <iface>.\n", argv[0]); exit(1); } fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (fd == -1) { perror("socket"); exit(1); } len = sizeof(struct sockaddr_ll); memset(&ll, 0, len); memset(&ifr, 0, sizeof(struct ifreq)); strncpy(ifr.ifr_name, argv[1], sizeof(ifr.ifr_name)); dummy = socket(AF_INET, SOCK_DGRAM, 0); if (dummy == -1) { perror("dummy"); exit(1); } ret = ioctl(dummy, SIOCGIFINDEX, &ifr); printf("index %d <--> %s as loopback mode\n", ifr.ifr_ifindex, ifr.ifr_name); ll.sll_family = AF_PACKET; ll.sll_ifindex = ifr.ifr_ifindex; ll.sll_protocol = htons(ETH_P_ALL); if (bind(fd, (struct sockaddr *) &ll, sizeof(struct sockaddr_ll)) == -1) { perror("bind"); exit(1); } printf("binding pf_packet to %s interface.\n", ifr.ifr_name); while(1) { memset(&buf, 0, sizeof(struct can_frame)); memset(buf.data, 0, 8); char data[8]; memset(data, 0, 8); sprintf(data, "%d", can_id); memcpy(frame.data, data, 8); frame.header.id = can_id; can_id++; if (can_id > 9999999) { can_id = 1; } frame.header.dlc = strlen(data); if (send(fd, &frame, sizeof(struct can_frame), 0) == -1) { perror("send"); } sleep(5); if (recv(fd, &buf, sizeof(struct can_frame), 0) == -1) { perror("recv"); } can_show_header(&buf.header); memset(buf.data+buf.header.dlc, 0, 8-buf.header.dlc); printf("RECV: %s\n", buf.data); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -