Linux-UDP-Socket编程
接收CAN总线上的数据并将其发送出去
创建客户端:
/********************************************************************
* copyright (C) 2018 all rights reserved
* @file: server.c
* @Created: 2018-4-16 13:22nd
* @Author: Yinrui Zhu
* @Description: test user eth0
* @Modify Date: 2018-4-13
*********************************************************************/ #include <limits.h>
#include <stdint.h>
#include <getopt.h>
#include <libgen.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h> #include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> #define SERVER_PORT 8000
#define BUFFER_SIZE 1024
#define ipaddr "192.168.200.110"
#define FILE_NAME_MAX_SIZE 512 int main()
{
int nbytes,i,addrlen;
char abuf[];
char bbuf[];
char cbuf[];
char dbuf[];
char ebuf[]; int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[];
int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW; system("ip link set can0 type can bitrate 125000 triple-sampling on");
sleep();
system("ip link set can0 up"); s = socket(family, type, proto); //创建套接字 strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX,&ifr); //指定can0设备 addr.can_family = family;
//addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( s, (struct sockaddr *)&addr, sizeof(addr) ); //将套接字与can0设备绑定 /*定义接收规则*/
rfilter[].can_id = 0x10; //接收ID为0x10的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x20; //接收ID为0x20的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x40; //接收ID为0x40的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x80; //接收ID为0x80的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x800; //接收ID为0x800的报文
rfilter[].can_mask = CAN_EFF_MASK; if( setsockopt( s,SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter,
sizeof(rfilter) ) != ) //设置过滤规则
{
perror("setsockopt");
exit();
} /*服务端地址*/
struct sockaddr_in server_addr;
bzero( &server_addr, sizeof(server_addr) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ipaddr);
server_addr.sin_port = htons(SERVER_PORT);
addrlen = sizeof(server_addr); /*创建socket*/
int client_socket_fd = socket(AF_INET, SOCK_DGRAM, );
if( client_socket_fd == - )
{
perror("Creat Socket Failed!");
exit();
} /*数据传输*/
while()
{
/*can接收数据*/
if( nbytes = read(s, &frame, sizeof(frame)) < )
{
perror("read");
return ;
} switch(frame.can_id)
{
case 0x10:
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
abuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d abuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, abuf[i]);
}
break; case 0x20:
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
bbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d bbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, bbuf[i]);
}
break; case 0x40:
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
cbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d cbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, cbuf[i]);
}
break; case 0x80:
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
dbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d dbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, dbuf[i]);
}
break; case 0x80000800:
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
ebuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d ebuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, ebuf[i]);
}
break; default :
printf("The recive can indetifer ID is wrong!\n");
break;
} sendto(client_socket_fd,abuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,bbuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,cbuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,dbuf,,,(struct sockaddr*)&server_addr, addrlen);
sendto(client_socket_fd,ebuf,,,(struct sockaddr*)&server_addr, addrlen);
printf("Hello.\n"); /*接收数据*/
/*
size_t recv_len = 0;
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
recv_len = recvfrom(server_socket_fd, buffer, BUFFER_SIZE, 0 ,(struct sockaddr*)&client_addr, &client_addr_length);
if( recv_len == -1 )
{
perror("Receive Data Failed:");
exit(1);
}
*/
/*从buffer中拷贝出file_name*/
/*
char file_name[FILE_NAME_MAX_SIZE +1];
bzero(file_name,FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n",file_name);
printf("%s\n",buffer);
*/ }
system("ip link set can0 down");
close(client_socket_fd);
return ;
}
编译生成client_can 使用说明:
、运行可执行文件client_can(./client_can)
、利用网络调试工具Socket_Tool.exe(F:\嵌入式资料\AM335X\BeagleBone\UDP_test\Socket_Tool.exe)
创建服务其端口:
a、192.168.200.110()
、另一快开发板can0设置:
a、ip link set can0 down
b ip link set can0 type can bitrate triple-sampling on
c ip link set can0 up
d cansend can0 -i 0x80 0xaa 0x11 0x55 0x44 0x11 0x22 0x33 0x66
、当can0的CANL、CANH上面有数据时:运行。/client_can的开发板就可以接收的相应的数据(
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xac
Hello. ),同时将数据通过网络发送给PC机的server服务器端
(
:: 收到数据:{ AA AA AA AC }
:: 收到数据:{ 0D FE B6 }ii
:: 收到数据:{ FD F7 BE }$
:: 收到数据:{ AA AA AA AC }
:: 收到数据:{B8 7B FC B6 4D 8C }竰
)。
PC端的服务器端口配置:

服务器端口:
/********************************************************************
* copyright (C) 2018 all rights reserved
* @file: server.c
* @Created: 2018-4-16 13:22nd
* @Author: Yinrui Zhu
* @Description: test user eth0
* @Modify Date: 2018-4-13
*********************************************************************/ #include <limits.h>
#include <stdint.h>
#include <getopt.h>
#include <libgen.h>
#include <signal.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h> #include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> #define SERVER_PORT 8000
#define BUFFER_SIZE 1024
#define ipaddr "192.168.200.110"
#define FILE_NAME_MAX_SIZE 512 int main()
{
int nbytes,i,addrlen;
char abuf[];
char bbuf[];
char cbuf[];
char dbuf[];
char ebuf[]; int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
struct can_filter rfilter[];
int family = PF_CAN, type = SOCK_RAW, proto = CAN_RAW; system("ip link set can0 type can bitrate 125000 triple-sampling on");
sleep();
system("ip link set can0 up"); s = socket(family, type, proto); //创建套接字 strcpy(ifr.ifr_name, "can0");
ioctl(s, SIOCGIFINDEX,&ifr); //指定can0设备 addr.can_family = family;
//addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind( s, (struct sockaddr *)&addr, sizeof(addr) ); //将套接字与can0设备绑定 /*定义接收规则*/
rfilter[].can_id = 0x10; //接收ID为0x10的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x20; //接收ID为0x20的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x40; //接收ID为0x40的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x80; //接收ID为0x80的报文
rfilter[].can_mask = CAN_SFF_MASK; rfilter[].can_id = 0x800; //接收ID为0x800的报文
rfilter[].can_mask = CAN_EFF_MASK; if( setsockopt( s,SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter,
sizeof(rfilter) ) != ) //设置过滤规则
{
perror("setsockopt");
exit();
} /*创建UDP套接口*/
struct sockaddr_in server_addr;
bzero( &server_addr, sizeof(server_addr) );
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT); /*创建socket*/
int server_socket_fd = socket(AF_INET, SOCK_DGRAM, );
if( server_socket_fd == - )
{
perror("Creat Socket Failed!");
exit();
} /*绑定套接口*/
if(- == ( bind( server_socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr) ) ) )
{
perror("Server Bind Failed: ");
exit();
} /*数据传输*/
while()
{
/*can接收数据*/
if( nbytes = read(s, &frame, sizeof(frame)) < )
{
perror("read");
return ;
} switch(frame.can_id)
{
case 0x10:
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = ((frame.can_id>>)&0xFF);
abuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
abuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d abuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, abuf[i]);
}
break; case 0x20:
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = ((frame.can_id>>)&0xFF);
bbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
bbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d bbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, bbuf[i]);
}
break; case 0x40:
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = ((frame.can_id>>)&0xFF);
cbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
cbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d cbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, cbuf[i]);
}
break; case 0x80:
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = ((frame.can_id>>)&0xFF);
dbuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
dbuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d dbuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, dbuf[i]);
}
break; case 0x80000800:
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = ((frame.can_id>>)&0xFF);
ebuf[] = (frame.can_id&0xFF);
for( i=; i<frame.can_dlc+; i++)
{
ebuf[i] = frame.data[i-];
printf("ID=0x%x DLC=%d ebuf[%d]=0x%x\n", frame.can_id, frame.can_dlc, i, ebuf[i]);
}
break; default :
printf("The recive can indetifer ID is wrong!\n");
break;
} /*定义一个地址,用于蒱获客户端地址*/
struct sockaddr_in client_addr;
socklen_t client_addr_length = sizeof(client_addr); /*接收数据*/
size_t recv_len = ;
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
recv_len = recvfrom(server_socket_fd, buffer, BUFFER_SIZE, ,(struct sockaddr*)&client_addr, &client_addr_length);
if( recv_len == - )
{
perror("Receive Data Failed:");
exit();
} /*从buffer中拷贝出file_name*/
char file_name[FILE_NAME_MAX_SIZE +];
bzero(file_name,FILE_NAME_MAX_SIZE+);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n",file_name);
printf("%s\n",buffer); sendto(server_socket_fd,buffer,recv_len,,(struct sockaddr*)&client_addr, client_addr_length); sendto(server_socket_fd,abuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,bbuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,cbuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,dbuf,,,(struct sockaddr*)&client_addr, client_addr_length);
sendto(server_socket_fd,ebuf,,,(struct sockaddr*)&client_addr, client_addr_length);
printf("Hello.\n"); }
system("ip link set can0 down");
close(server_socket_fd);
return ;
}
PC端客户端配置:

编译生成server.can 使用说明:
、运行可执行文件server_can(./server_can)
、利用网络调试工具Socket_Tool.exe(F:\嵌入式资料\AM335X\BeagleBone\UDP_test\Socket_Tool.exe)
创建客户端口:
a、192.168.200.70()
、另一快开发板can0设置:
a、ip link set can0 down
b ip link set can0 type can bitrate triple-sampling on
c ip link set can0 up
d cansend can0 -i 0x80 0xaa 0x11 0x55 0x44 0x11 0x22 0x33 0x66
、当can0的CANL、CANH上面有数据时:运行。/server_can的开发板就可以接收的相应的数据(
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0x55
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xaa
ID=0x80 DLC= dbuf[]=0xac
Hello. ),但是接收到的数据只能发送一次。因为该板子作为服务器端口,需要客户端给该板子发送一个信号(any)。最为客户端的PC机才能接收服务器端(开发板)发过来的数据
(
:: 收到数据:{ DD D4 BE }$
:: 收到数据:{ C5 8F }(
:: 收到数据:{B8 3B F1 B6 8F }?穸
:: 发送数据:猍1次]
:: 收到数据:{AA }
:: 收到数据:{ AA AA AA AC }
:: 收到数据:{ 0D F3 B6 }ii
:: 收到数据:{ DD D4 BE }$
:: 收到数据:{ C5 8F }(
:: 收到数据:{B8 3B F1 B6 8F }?穸
)。
Linux-UDP-Socket编程的更多相关文章
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- Linux的SOCKET编程详解(转)
Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...
- 【ARM-Linux开发】Linux的SOCKET编程详解
Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系 ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
- linux下socket编程
相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...
- Linux的SOCKET编程详解
1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...
- [转]Linux的SOCKET编程详解
From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...
随机推荐
- 【Loadrunner】LR参数化:利用mysql数据库里面的数据进行参数化
很多同学都在自学loadrunner去做压力测试,但是如果要利用LR做压力测试,或者是其他工具,其中有一个环节是我们避开不了的,比如说:参数化 今天华华就给大家简要的介绍下,如果你要做的参数化的数据来 ...
- Tickets HDU1260
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1260 (http://www.fjutacm.com/Problem.jsp?pid=1382) 题意 ...
- 2016.5.24——Intersection of Two Linked Lists
Intersection of Two Linked Lists 本题收获: 1.链表的输入输出 2.交叉链表:这个链表可以有交叉点,只要前一个节点的的->next相同即可. 题目:Inters ...
- Linux硬盘镜像获取与还原(dd、AccessData FTK Imager)
1.硬盘镜像获取工具:dd dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 1.1 本地取数据 查看磁盘及分区 # fdisk - ...
- 微信web开发者工具无法打开的解决方法
参考网址:https://blog.csdn.net/gz506840597/article/details/77915488 我试了上面兄弟说的方法还是无效 下面说说我的方法: 我打开文件所在位置, ...
- IDL界面程序直接调用envi菜单对应功能
参考自http://blog.sina.com.cn/s/blog_764b1e9d010115qu.html 参考文章的方法是构建一个button控件,通过单击实现,这种方法比较复杂,不是我们经常能 ...
- IIS 启用https
参考:http://www.cnblogs.com/dudu/p/iis_https_ca.html
- mac系统安装redis
1.下载 打开官网:https://redis.io/ Download---Stable---Download3.2.8,下载最新稳定版,这里是3.2.8 2.安装 下载完成后,打开命令行工具,执行 ...
- 【[国家集训队]小Z的袜子】
对于L,R的询问.设其中颜色为x,y,z的袜子的个数为a,b,c...那么答案即为(a*(a-1)/2+b*(b-1)/2+c*(c-1)/2....)/((R-L+1)*(R-L)/2)化简得:(a ...
- Java事务管理之Spring+Hibernate
环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...