【1】 UNIX域套接字
本地的进程间通信
s socket
前5天的内容TCP,UDP 都是依赖IP 端口号进行通信的
struct sockaddr_in serveradd; //网络信息结构体 internet
unix域套接字编程,实现本间进程的通信,
依赖的是s类型的文件;
服务器端:
1. socket(AF_UNIX, SOCK_STREAM, 0)
填充结构体:
struct sockaddr_un serveradd; //unix
struct sockaddr_un {
__kernel_sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* pathname */
};
用法:
struct sockaddr_un serveraddr;
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path,"myunixfile");
2. bind(,本地地址, )
3. listen(,)
4. accept(,,)
5. recv() / send()
用法实例:
客户端:
1. socket(AF_UNIX, SOCK_STREAM, 0)
2. 填充struct sockaddr_un 结构体
3. connect(,,)
4. recv() / send()
……
用法实例:
unlink("myunixtcp");//可重复利用链接文件
htons()
htonl(INADDR_ANY);
【2】 数据库
sqlite3
sqlite3 安装:
1. sudo dpkg -i *.deb 离线安装
2. 在线安装
1、设置能够上网
2、更新更新源
# sudo apt-get update
3、安装软件及开发环境
# apt-get install sqlite3 --->sqlite3数据库软件
# apt-get install libsqlite3-dev --->sqlite3数据库开发支持库
# apt-get install sqlite3-doc --->sqlite3数据库说明文档
--------------------------------
# sudo apt-get install sqlitebrowser
--->sqlite3数据库操作软件
测试是否安装成功:
SQLite version 3.7.9
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
如果出现以上内容,表示安装成功;
【3】
操作数据库
{1}. 命令的方式操作
sqlite3 数据库文件名(stu.db)
两种命令:
1.
sqlite3系统命令
都是以
'.' 开头的
a. .help 查看所有支持的命令
b. .quit 退出
c. .tables 查看有哪些表
d. .schema stu2 查看表结构
2.
SQL命令
SQL命令是以 “;” 结尾
1. 创建一个表.out
create table stu(id int,name char,score float);
create table stu(id int primary key, name char, score float);
注:把id字段设置为主键(在表中唯一);
字符串:char string text
小数:float real
不支持严格的类型检查的;
2. 删除一个表
drop table <table_name>;
...>;
3. 向表里面插入数据
insert into <table_name> values(value1, value2,…);
insert into stu values(1,"xiaomingx",99.9);
//只插入部分字段 id name score
insert into stu(id,name) values(4,'xiaoming');
4. 查找数据
查询表中所有记录
select * from <table_name>;
按指定条件查询表中记录
select * from <table_name> where <expression>;
select * from stu where id=2;
select * from stu where id=2 and name='lisi';
select * from stu where id=1 or name='zhangsan';
select score from stu where name='LiSi' or id=3; //限定条件查询
select name,score from stu where name='LiSi' or id=3;
select * from stu limit 5; //只查询前n条记录
select * from stu order by id desc; //按id从大到小进行排序
5. 修改(更新)数据
update <table_name> set <f1=value1>, <f2=value2>… where <expression>;
update stu set id=10 where id=1;
6. 增加字段
alter table <table> add column <field> <type> default …;
alter table stu add column class int default 1;
7.删除字段操作
1)create table student as select id,name,score from stu;
创建一个student表,从stu表当中复制id,name,score
2) drop table stu;
删除原有的stu表
3) alter table student rename to stu;
重命名
{2}
.
C代码的方式操作sqlite
sqlite3API接口查询地址:
https://www.sqlite.org/c3ref/sqlite3.html :
int sqlite3_open(char *path, sqlite3 **db);
功能:打开sqlite数据库
参数:
path: 数据库文件路径
db: 指向sqlite句柄的指针
返回值:成功返回0,失败返回错误码(非零值)
sqlite3 *db;
sqlite3_open("stu.db",&db);
值传递: 获取到值
地址传递: 修改值得使用地址传递
==========================================
int sqlite3_close(sqlite3 *db);
功能:关闭sqlite数据库
返回值:成功返回0,失败返回错误码
sqlite3_close(db);
==========================================
const char *sqlite3_errmsg(sqlite3 *db);
返回值:返回错误信息
perror("open failed.");
fprintf(stderr,"sqlite3_open failed %s\n",sqlite3_errmsg(db));
=================================
注意编译时出现以下问题:
linux@ubuntu:~/1907-net/day6/sqlite3$ gcc 1_sqlite3.c
/tmp/ccDbTidR.o: In function `main':
1_sqlite3.c:(.text+0x19): undefined reference to `sqlite3_open'
1_sqlite3.c:(.text+0x29): undefined reference to `sqlite3_errmsg'
1_sqlite3.c:(.text+0x5c): undefined reference to `sqlite3_close'
collect2: ld returned 1 exit status
应该链接库:
gcc 1_sqlite3.c -lsqlite3
=====================================
typedef int (*sqlite3_callback)(void *, int, char **, char **);
sqlite3_callback int (*)(void *, int, char **, char **)
int sqlite3_exec(sqlite3
*db
, const char
*sql
,
sqlite3_callback
callback
, void
*arg
, char
**errmsg
);
非查询时: (句柄) (NULL) (NULL)
功能:执行SQL语句
db:数据库句柄
sql:SQL语句 ("create table stu .....;")
callback:回调函数
void * arg:(给回调函数传的参数)
当使用查询命令的时候,callback和arg才有意义;
select .....
errmsg:错误信息指针的地址
char *errmsg;
&errmsg;
返回值:成功返回0,失败返回错误码
举个例子:
创建一个stu表
sqlite3_exec(db,"create table stu(id int,name char,score float);"
NULL,NULL,&errmsg);
============================================================
int callback(void *para, int f_num, char **f_value, char **f_name);
功能:
每找到一条记录自动执行一次回调函数
id
|
name
|
score
|
1
|
运才
|
10.2
|
2
|
一文
|
12.1
|
para: 传递给回调函数的参数
f_num: 记录中包含的字段数目(id name score)
相当于有多少列;
f_value:包含每个字段值的指针数组
f_name:包含每个字段名称的指针数组
callback函数:
用sqlite3_exec实现select:
返回值:成功返回0,失败返回-1
================================================================
char sql[128];
int id = 1;
char *name = "zhaoliu";
float score = 88.8;
sprintf(sql,"insert into stu values(%d,\"%s\",%f);",id,name,score);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != 0)
=================================================================
不使用回调函数执行SQL语句
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);
功能:执行SQL操作
db:数据库句柄
sql:SQL语句
resultp:用来指向sql执行结果的指针;实际上就是“指针数组指针”;
nrow:满足条件的记录的数目,实际上就是有多少行数据;
ncolumn:每条记录包含的字段数目,实际上就是有多少个字段(多少列);
errmsg:错误信息指针的地址
返回值:成功返回0,失败返回错误码、、