网络编程学习记录_3

目录

1.网络超时检测

2.广播

3.组播

4.本地通信

5.数据库

6.SQLite3


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.数据库

数据:能输入计算机,并能被计算机处理的信息集合。

数据库:通过数据库管理系统管理和控制,存放在存储设备上的数据集合。

访问文件存在的问题:

  1. 文件里存放的是文本数据或者二级制数据,不是结构化的数据,读取解析效率低。
  2. 程序与数据文件缺乏高度独立性,针对某个文件的读写程序,只能用于该文件。

 

6.SQLite3

  1. SQLite简介

用C语言写的一个数据库,完全开放源代码,是一个轻量级的嵌入式数据库。

SQLite有以下特性:

  1. 零配置一无需安装和管理配置;
  2. 储存在单一磁盘文件中的一个完整的数据库;
  3. 数据库文件可以在不同字节顺序的机器间自由共享;
  4. 支持数据库大小至2TB;
  5. 足够小,全部源码大致3万行c代码,250KB;
  6. 比目前流行的大多数数据库对数据的操作要快。
  1. SQLite官网:SQLite Home Page

SQLite菜鸟教程:SQLite – C/C++ | 菜鸟教程

  1. 安装SQLite3

sudo apt-get install sqlite3

sudo apt-get install libsqlite3-dev

  1. SQLite的数据类型

  1. SQLite的约束

  1. SQLite的系统命令(点命令)
  1. 打开数据库,如果数据库不存在则创建:

sqlite3 数据库名称

例如:sqlite3 test.db

  1. 查询数据库帮助信息:

.help

  1. 查询数据库文件的路径:

.databases

  1. 退出数据库命令行:

.quit

.exit

  1. 查询数据库的所有表:

.tables

  1. 查询创建表的语句:

.schema

  1. SQL语句

SQL语句不以点开头,但是要以分号结尾。

  1. 创建表

create table 表名(字段1 数据类型 约束, 字段2 数据类型 约束 ……);

create table stu(id integer primary key not null, name text not null, age integer);

  1. 插入数据

insert into 表名 values(字段1的值, 字段2的值, ……);

insert into stu values(1001, 'zhangsan', 20);

insert into 表名(指定字段……) values(指定字段的值);

insert into stu(id, name) values(1002, 'lisi');

  1. 查询数据

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;

  1. 更新数据

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';

  1. 删除数据

delete from 表名 where 条件表达式;

delete from stu where name='lisi';

  1. 增加字段

alter table 表名 add colu;mn 新增字段 新增字段类型;

alter table stu add column score integer;

  1. 删除字段

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;

  1. 删除表

drop table 表名;

drop table stu;

  1. SQLite3编程接口
  1. int sqlite3_open(char *path, sqlite3 **db);

功能:打开数据,如果数据库不存在,则创建数据库。

参数1:数据库文件的路径(包括数据库文件名)。

参数2:保存打开或者创建的数据库句柄。

返回值:成功返回0(SQLITE_OK),失败返回错误码。

  1. int sqlite3_close(sqlite3 *d;

功能:关闭数据库。

参数1:数据库的句柄。

返回值:成功返回0(SQLITE_OK),失败返回错误码。

  1. const char *sqlite3_errmsg(sqlite3 *db);

功能:获取错误信息。

参数1:数据库句柄。

返回值:错误信息。

  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。

  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,失败返回错误码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值