目录
1.网络超时检测
用setsockopt设置套接字超时时间:
struct timeval tv;
tv.tv_sec = 5; // 时间单位是秒,设置5秒时间
tv.tv_usec = 0; // 时间定位是微秒
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
recv()/recvfrom()
设置select超时时间:
参数1:监控文件描述符的最大数数量
参数2:读文件描述符集合
参数3:写文件描述符集合
参数4:异常文件描述符集合
参数5:timeout是select超时时间
设置成NULL是,阻塞等待,直到关注的文件描述符的IO通道上有数据发生。
设置一个超时时间,如果超时时间到了,还没有数据发生,也会返回。
设置超时时间为0,select回立即返回,消耗CPU资源。
返回值:大于0,成功。返回有数据发生的文件描述符IO通道的数量。
等于0,超时。
小于0,出错。
用信号触发套接字超时:
alarm()是一个闹钟函数,参数可以设置一个超时时间。如果超时间到,会触发一个SIGALARM信号。
sigaction函数:
参数1:信号
参数2:给信号设置新的属性
参数3:存放信号原有老的属性
SA_RESTART:给信号设置SA_RESTART属性,recv函数被该信号打断后,不返回-1,继续执行recv函数。
清除信号的该属性后,如果收到该信号,recv函数会返回-1,errno被设置为EINTR。
void handler(int signo) { alarm(5); }
struct sigaction act;
sigaction(SIGALRM, NULL, &act); // 获取信号的原有属性
act.sa_handler = handler; // 设置信号处理函数
act.sa_flags &= ~SA_RESTART; // 清除SA_RESTART位
sigaction(SIGALRM, &act, NULL); // 设置信号的新属性
alarm(5);
if (recv(,,,) < 0) ……
2.广播
广播是给局域网里的所有主机发送消息。
广播是能用UDP实现。
每个网段最大的主机号是本网段的广播地址。比如:
192.168.1.0/24网段,广播地址就是1092.168.1.255。
255.255.255.255是所有网段的广播地址。
3.组播
组播又叫多播,一台主机发送消息,只有加入多播组的主机才能接收到消息。
组播必须用UDP实现。
组播地址:224.0.0.0-239.255.255.255(广播地址和网络地址都要排除掉)
4.本地通信
Unix域套接字用于本地进程间通信,通信效率仅次于共享内存,但是由于共享内存通常要搭配信号量使用,做资源同步和互斥,所以用起来比共享内存要简单。
创建套接字用AF_UNIX或者AF_LOCAL。
既可以式流式套接字(SOCK_STREAM),也可以是用户数据报套接字(SOCK_DGRAM)。
5.数据库
数据:能输入计算机,并能被计算机处理的信息集合。
数据库:通过数据库管理系统管理和控制,存放在存储设备上的数据集合。
访问文件存在的问题:
- 文件里存放的是文本数据或者二级制数据,不是结构化的数据,读取解析效率低。
- 程序与数据文件缺乏高度独立性,针对某个文件的读写程序,只能用于该文件。
6.SQLite3
- SQLite简介
用C语言写的一个数据库,完全开放源代码,是一个轻量级的嵌入式数据库。
SQLite有以下特性:
- 零配置一无需安装和管理配置;
- 储存在单一磁盘文件中的一个完整的数据库;
- 数据库文件可以在不同字节顺序的机器间自由共享;
- 支持数据库大小至2TB;
- 足够小,全部源码大致3万行c代码,250KB;
- 比目前流行的大多数数据库对数据的操作要快。
- SQLite官网:SQLite Home Page
SQLite菜鸟教程:SQLite – C/C++ | 菜鸟教程
- 安装SQLite3
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev
- SQLite的数据类型
- SQLite的约束
- SQLite的系统命令(点命令)
- 打开数据库,如果数据库不存在则创建:
sqlite3 数据库名称
例如:sqlite3 test.db
- 查询数据库帮助信息:
.help
- 查询数据库文件的路径:
.databases
- 退出数据库命令行:
.quit
.exit
- 查询数据库的所有表:
.tables
- 查询创建表的语句:
.schema
- SQL语句
SQL语句不以点开头,但是要以分号结尾。
- 创建表
create table 表名(字段1 数据类型 约束, 字段2 数据类型 约束 ……);
create table stu(id integer primary key not null, name text not null, age integer);
- 插入数据
insert into 表名 values(字段1的值, 字段2的值, ……);
insert into stu values(1001, 'zhangsan', 20);
insert into 表名(指定字段……) values(指定字段的值);
insert into stu(id, name) values(1002, 'lisi');
- 查询数据
select 查询字段 from 表名 查询条件;
select * from stu;
select id, name from stu;
select * from stu where name='zhangsan';
select * from stu where name='zhangsan' and id=1001;
select * from stu where name='zhangsan' or id=1002;
- 更新数据
update 表名 set 字段1=字段1的新值, 字段2=字段2的新值 where 条件表达式;
update stu set name='wangwu' where name='lisi';
update stu set name='lisi', age=21 where name='wangwu';
- 删除数据
delete from 表名 where 条件表达式;
delete from stu where name='lisi';
- 增加字段
alter table 表名 add colu;mn 新增字段 新增字段类型;
alter table stu add column score integer;
- 删除字段
SQLite3不支持直接删除字段,需要建立新表改名成旧表。
create table 临时表名 as select 不删除的字段 from 旧表名;
drop table 旧表名;
alter table 临时表名 rename to 旧表名;
create table stu1 as select id, name, score from stu;
drop table stu;
alter table stu1 rename to stu;
- 删除表
drop table 表名;
drop table stu;
- SQLite3编程接口
- int sqlite3_open(char *path, sqlite3 **db);
功能:打开数据,如果数据库不存在,则创建数据库。
参数1:数据库文件的路径(包括数据库文件名)。
参数2:保存打开或者创建的数据库句柄。
返回值:成功返回0(SQLITE_OK),失败返回错误码。
- int sqlite3_close(sqlite3 *d;
功能:关闭数据库。
参数1:数据库的句柄。
返回值:成功返回0(SQLITE_OK),失败返回错误码。
- const char *sqlite3_errmsg(sqlite3 *db);
功能:获取错误信息。
参数1:数据库句柄。
返回值:错误信息。
- int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
功能:执行SQL语句。
参数1:数据库句柄。
参数2:SQL语句。
参数3:回调函数,用于查询SQL语句返回查询结果。
参数4:传递给回调函数的参数。
参数5:错误信息。
返回值:成功返回0,失败返回错误码。
回调函数:
typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
功能:用于返回SQL查询结果。
参数1:sqlite3_exec的参数4。
参数2:查询结果返回字段的数量。
参数3:查询结果返回字段的值。
参数4:查询结果返回的字段。
返回值:成功返回0,失败返回-1。
- int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
功能:获取SQL语句执行的返回的查询结果。
参数1:数据库句柄。
参数2:SQL语句。
参数3:SQL语句查询结果。
参数4:满足条件记录的数目。
参数5:每条记录包含的字段数目。
参数6:错误信息。
返回值:成功返回0,失败返回错误码。