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. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...
随机推荐
- 20155307 2016-2017-2 《Java程序设计》第6周学习总结
20155307 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 串流数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取出,可以使用输入串流:如果 ...
- 【leetcode 简单】 第六十题 反转链表
反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代 ...
- js 各类判断用户输入字符的格式函数
1.JS 判断IP格式是否正确: function checkIP(ip) { var regular = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;//正则表达式 if (reg ...
- Go net/http获取body中json格式数据
Go net/http获取body中json格式数据 package main import ( "encoding/json" "fmt" "io/ ...
- 10种CSS3实现的Loading效果
原文链接:http://www.cnblogs.com/jr1993/p/4622039.html 第一种效果: 代码如下: <div class="loading"> ...
- ASM配置OGG
两种方法:http://blog.sina.com.cn/s/blog_aa84cfe40101lsks.html 使用ACFS配置OGG:http://ylw6006.blog.51cto.com/ ...
- 【算法学习】【洛谷】cdq分治 & P3810 三维偏序
cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...
- Python Challenge 第 5 关攻略:peak
# -*- coding: utf-8 -*- # @Time : 2018/9/26 14:03 # @Author : cxa # @File : pickledemo.py # @Softwar ...
- SQLAlchemy-对象关系教程ORM-create
ORM是建立在SQL语言构造器之上的工具集,用于将Python对象映射到数据库的行,提供了一系列接口用于从数据库中存取对象(行).在ORM 工作时,在底层调用SQL语言构造器的API,这些通用的操作有 ...
- 数据库-mysql管理
MySQL 管理 启动及关闭 MySQL 服务器 首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql ...