Linux SocketCan client server demo hacking

简介: /*********************************************************************** * Linux SocketCan client server demo hacking * 说明: * 本文主要是解读Linux上的SocketCan的基本使用方法,内容和Linux上的 * 网络编程差不多。
/***********************************************************************
 *           Linux SocketCan client server demo hacking
 * 说明:
 *     本文主要是解读Linux上的SocketCan的基本使用方法,内容和Linux上的
 * 网络编程差不多。
 *  
 *                                    2016-3-28 深圳 南山平山村 曾剑锋
 **********************************************************************/

一、cat client.c
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <linux/can.h>
    
    #ifndef PF_CAN
    #define PF_CAN 29
    #endif
    
    #ifndef AF_CAN
    #define AF_CAN PF_CAN
    #endif
    
    int main()
    {
        int s;
        unsigned long nbytes;
        struct sockaddr_can addr;
        struct ifreq ifr;
        struct can_frame frame;
    
        // 创建一个SocketCan
        s = socket(PF_CAN,SOCK_RAW,CAN_RAW);
    
        // 设置一些参数,这个是使用的can网络的设备号
        strcpy((char *)(ifr.ifr_name),"can0");
        ioctl(s,SIOCGIFINDEX,&ifr);
        printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
    
        // 设置使用CAN协议
        addr.can_family = AF_CAN;
        addr.can_ifindex = ifr.ifr_ifindex;
        bind(s,(struct sockaddr*)&addr,sizeof(addr));
    
        // 设置发送到的设备id
        frame.can_id = 0x123;
        strcpy((char *)frame.data,"hello");
        frame.can_dlc = strlen(frame.data);
    
        printf("Send a CAN frame from interface %s\n",ifr.ifr_name);
    
        // 发送数据
        nbytes = sendto(s,&frame,sizeof(struct can_frame),0,(struct sockaddr*)&addr,sizeof(addr));
        
        return 0;
    }

二、cat server.c
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <linux/can.h>
    
    #ifndef PF_CAN
    #define PF_CAN 29
    #endif
    
    #ifndef AF_CAN
    #define AF_CAN PF_CAN
    #endif
    
    int main()
    {
        int s;
        unsigned long nbytes,len;
        struct sockaddr_can addr;
        struct ifreq ifr;
        struct can_frame frame;
    
        // 创建一个SocketCan
        s = socket(PF_CAN,SOCK_RAW,CAN_RAW);
    
        // 指定使用的Can网络
        strcpy(ifr.ifr_name,"can0");
        ioctl(s,SIOCGIFINDEX,&ifr);
        printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);
    
        // 指定使用的协议,并绑定
        //bind to all enabled can interface
        addr.can_family = AF_CAN;
        addr.can_ifindex =0;
        bind(s,(struct sockaddr*)&addr,sizeof(addr));
    
        // 获取数据
        nbytes = recvfrom(s,&frame,sizeof(struct can_frame),0,(struct sockaddr *)&addr,&len);
        
        /*get interface name of the received CAN frame*/
        ifr.ifr_ifindex = addr.can_ifindex;
        ioctl(s,SIOCGIFNAME,&ifr);
        printf("Received a CAN frame from interface %s\n",ifr.ifr_name);
        printf("frame message\n"
            "--can_id = %x\n"
            "--can_dlc = %x\n"
            "--data = %s\n",frame.can_id,frame.can_dlc,frame.data);
    
        return 0;
    }
    

 

目录
打赏
0
0
0
0
12
分享
相关文章
如何在Linux运行RStudio Server并实现Web浏览器远程访问
如何在Linux运行RStudio Server并实现Web浏览器远程访问
284 0
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
61 16
|
8月前
|
linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除
linux /www/server/cron内log文件占用空间过大,/www/server/cron是什么内容,/www/server/cron是否可以删除
126 1
|
9月前
|
【linux服务器系统盘爆满】/www/server/total/logs/目录内容过多导致服务器系统盘爆满,/www/server/total/logs/ 里是什么内容?是否可以删除?
【linux服务器系统盘爆满】/www/server/total/logs/目录内容过多导致服务器系统盘爆满,/www/server/total/logs/ 里是什么内容?是否可以删除?
158 1
xmanager 4 连接SuSE linux server 11方法
xmanager 4 连接SuSE linux server 11方法
58 1
Linux联网安装MySQL Server
Linux联网安装MySQL Server
130 0
SuSE linux server 11通过SAP来安装oracle11g
SuSE linux server 11通过SAP来安装oracle11g
147 0
VMware安装无GUI版本的Linux(CentOS7)——安装Nginx示例demo
VMware安装无GUI版本的Linux(CentOS7)——安装Nginx示例demo
230 1
|
10月前
|
linux实现守护进程demo
linux实现守护进程demo
49 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等