【1】组播
组播代码流程:—UDP协议
发送者:
1、创建用户数据报套接字
2、指定组播地址224.0.0.0~
3、发送(sendto)
接收者:
1、创建用户数据报套接字
2、设置套接字属性为组播属性
IPPROTO_IP
struct ip_mreqn {
struct in_addr imr_multiaddr; /* IP multicast groupaddress */
struct in_addr imr_address; /* IP address of local interface */
int imr_ifindex; /* interface index 填0*/
};
填充组播地址,若本机测试允许地址重复使用
3、绑定ip地址bind
4、接收recvfrom
【2】UNIX域套接字(了解)
是一种本地通信,借助S类型套接字文件
AF_UNIX, AF_LOCAL 本地通信 unix(7)
服务器端:
1、创建套接字socket–AF_UNIX
2、填充本地地址, struct sockaddr_un
struct sockaddr_un {
sa_family_t sun_family; /* 协议 */
char sun_path[UNIX_PATH_MAX]; /* S文件路径 */
};
3、绑定地址bind
4、监听listen
5、连接客户端accept
6、接收发送send/recv
7、关闭套接字close
客户端:
1、创建套接字socket–AF_UNIX
2、填充本地地址, struct sockaddr_un
3、connect连接
4、收发数据send/recv
5、关闭套接字close
注意:
unlink去释放s类型文件连接,原因是因为套接字文件被创建后
服务器和客户端连接后,该文件存在双向链接,再次执行时需要释放。
【3】sqlite数据库
基于嵌入式linux相关数据库:SQLite,轻量级的嵌入式数据库
sqlite3 安装:
在线安装:sudo apt-get install sqlite3
//sqlite3工具包
sudo apt-get install libsqlite3-dev
//数据库开发支持库
sudo apt-get install sqlitebrowser
//sqlite3图形界面操作软件
操作数据库
(1)命令的方式操作数据
创建一个数据库:sqlite3 数据库文件名(后缀为db的文件)
两种命令
1、sqlite3系统命令
都是以.开头的,.help查看所有支持的命令
常用.help(帮助) .exit(退出) .tables(查看该数据库有几个表)
.schema 表名:查看具体某个表的结构
2、SQL命令
命令+表或值; ----->分号代表一句命令结束
(1)create table stu(id int,name char,score float); 创建一个表
若已经存在该表则使用create table if not exists stu(id int ,name char,score float);
注:在数据库中创建表时,数据库不严格检查类型,SQL命令以“;”结尾。
create table stu(id int primary key,name char,score float);
primary key:主键修饰,代表唯一
(2)删除一个表
drop table 表名;
(3)向表内插入数据(也就是向表内某个字段赋值,也就是填充表内字段)
insert into stu values(1,"xiaoming",99.9);
(4)查询表内数据
select * from stu;查询整个stu表内内容
select * from stu where name="xiaoming";
查询stu表中名字为xiaoming的学生信息
sqlite> select * from stu where name="lisi" and id = 2;
查询stu表中名字为lisi且id为2的学生信息
select * from stu limit 2;查询表内前两条信息
select * from stu order by score desc;查询表内score成绩从小到大排序
注:from后跟表,where后跟条件,*代表所有字段,可改变成任意字段
例如 select score from stu where name="xiaoming";
查询stu表内xiaoming的分数
(5)修改表内数据
update 表名 set <f1=value1>, <f2=value2>... where id=value;
eg:
update stu set id=3 where name="lisi";
将stu表内name为lisi的id字段更改为3.
(6)增加表内字段
alter table 表名 add column 字段名字 字段类型 default 数值;
eg:alter table stu add column class int default 1;
将stu表增加一个字段名字为calss,类型为int,默认为1;
(7)删除表内字段
sqlite3不支持删除字段
1)create table student as select id,name,score from stu;
创建一个student表正如stu里面包含id name score三个字段。
2)drop table stu;删除表名
3)alter table student rename to stu;
(8)删除表具备条件的一行数据(一行内的所有字段)
eg:delete from stu where id=1;
删除stu表中id为1的一行数据
练习: 创建一个数据库test.db,创建学生表,赋予学号,姓名,成绩
老师表,赋予工号,姓名,等级
(2)C语言操作数据库
sqlite3API接口查询地址:
https://www.sqlite.org/c3ref/sqlite3.html
(1)打开数据库
sqlite3_open(const char *filename, /* 数据库文件名 (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite 数据库句柄 */);
成功返回值:SQLITE_OK
例如:
sqlite3 * db;
sqlite3_open("my.db",&db);
(2)关闭数据库
sqlite3_close(db);
(3)返回错误信息
const char *sqlite3_errmsg(sqlite3*);
sqlite3_errmsg(db);
sprintf(buf,"insert into stu values(%d,\"%s\",%f);",10086,"xiaoming",99.5);
int sqlite3_exec(
sqlite3 *,/ *开放数据库* /
const char * sql,/ *要评估的SQL语句 */
int(* callback)(void *,int,char **,char **),/ *回调函数* /
void*,/ *回调的第一个参数*,查询命令时callback和这个才有意义*/
char ** errmsg / *错误消息写在这里* /
);
注:每找到一条记录会自动执行一次回调函数。
第一个参数:传递回调函数的参数
第二个参数:记录中包含的字段数目(列数)
第三个参数:包含每个字段值的指针数组
第四个参数:每个字段名称的指针数组
id name level
100|hhhhh|A
100|hhhhh|A
100|hhhhh|A
练习:使用数据库C接口建立一个学生表,实现插入数据,
查询数据。
作业:
通过客户端发送指令在服务器建立学生表并且成功插入从客户端输入的
学生信息。
通信协议:
#define C ‘c’
#define I ‘i’
struct student{
char name[32];
int id;
float score;
};
服务器:
建立数据库
创建表
recv表内字段内容
插入表内
客户端:
printf(*****1.创建学生表 2.插入学生信息)
创建学生表函数:
输入命令发送给对方
插入学生信息:
输入命令,学生信息