广播,数据库01 day43
十三:广播和组播
一:广播
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
| 参数名 | 说明 |
| --------- | ----------------------------------------------------------------------------------------------------------- |
| `sockfd` | **套接字描述符**,即由 `socket()` 返回的文件描述符。 |
| `level` | **设置的协议层级**,常见的有:<br>- `SOL_SOCKET`:通用 socket 级别选项<br>- `IPPROTO_TCP`:TCP 级别的选项<br>- `IPPROTO_IP`:IPv4 选项等。 |
| `optname` | **具体设置的选项名**,如:<br>- `SO_REUSEADDR`:地址复用<br>- `SO_RCVBUF`:接收缓冲区大小<br>- `SO_SNDTIMEO`:发送超时时间 等等。 |
| `optval` | 指向包含**选项值的变量**的指针。根据选项不同,它可能是 `int`、`struct timeval` 等。 |
| `optlen` | `optval` 的大小,单位是字节(`sizeof(type)`)。
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>
#include <arpa/inet.h>
typedef struct sockaddr* (SA);
int main(int argc, char **argv) {int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser, cli;ser.sin_family = AF_INET;ser.sin_port = htons(9999);//广播固定地址ser.sin_addr.s_addr =0;int ret = bind(sockfd, (SA)&ser, sizeof(ser));if (-1 == ret) {perror("bind");exit(1);}socklen_t len = sizeof(cli);while(1){char buf[512]={0};recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);printf("%s\n",buf);}return 0;
}
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
typedef struct sockaddr* (SA);
int main(int argc, char **argv)
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");exit(1);}
//man 7 socket 208socklen_t on =1;setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));struct sockaddr_in all;all.sin_family = AF_INET;all.sin_port = htons(9999);all.sin_addr.s_addr = inet_addr("192.168.0.255");//广播固定地址while(1){char buf[]="this is udp boardcast test...";sendto(sockfd,buf,strlen(buf),0,(SA)&all,sizeof(all));sleep(1);}return 0;
}
二:组播
先.r再.s
//recv#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>
typedef struct sockaddr *(SA);
#define MUTIL_ADDR "235.1.2.3"
int main(int argc, char **argv) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");exit(1);}//本机 地址struct sockaddr_in local, sendaddr;local.sin_family = AF_INET;local.sin_port = htons(9999);// ip is 0local.sin_addr.s_addr = INADDR_ANY;int ret = bind(sockfd,(SA)&local,sizeof(local));if(-1 ==ret){perror("bind");exit(1);}struct ip_mreqn multiaddr;multiaddr.imr_multiaddr.s_addr = inet_addr(MUTIL_ADDR);multiaddr.imr_address.s_addr = INADDR_ANY;// 0 to indicate any interface.multiaddr.imr_ifindex = 0;//把自己的地址加入组播地址//man 7 ip 89setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &multiaddr,sizeof(multiaddr));char sendaddrbuf[64] = {0};socklen_t len = sizeof(sendaddr);while (1) {char buf[512] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&sendaddr, &len);printf("%s:%d %s\n",inet_ntop(AF_INET, &sendaddr.sin_addr, sendaddrbuf,sizeof(sendaddrbuf)),ntohs(sendaddr.sin_port), buf);sprintf(buf, "%s %s", buf, "aaa");// send mutil castsendto(sockfd, buf, strlen(buf), 0, (SA)&sendaddr, sizeof(sendaddr));sleep(1);}return 0;
}
//send#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
typedef struct sockaddr* (SA);
#define MUTIL_ADDR "235.1.2.3"
int main(int argc, char **argv)
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in cli,sendaddr;cli.sin_family = AF_INET;cli.sin_port = htons(9999);cli.sin_addr.s_addr =inet_addr(MUTIL_ADDR);char sendaddrbuf[64]={0};socklen_t len = sizeof(cli);while(1){char buf[512]="this is udp mulitcast test";//send mutil castsendto(sockfd,buf,strlen(buf),0,(SA)&cli,sizeof(cli));bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,(SA)&sendaddr,&len);printf("%s:%d %s\n",inet_ntop(AF_INET,&sendaddr.sin_addr,sendaddrbuf,sizeof(sendaddrbuf)),ntohs(sendaddr.sin_port),buf);}return 0;
}
数据库
一:基础概念
sunsolaris gnu
1、分类: 大型 中型 小型
ORACLE MYSQL/MSSQL SQLITE DBII powdb
关系型数据库
2、名词:
DB 数据库 select update database
DBMS 数据库管理系统
MIS 管理信息系统
OA 办公自动化
3、嵌入式数据库:
sqlite3 www.sqlite.org www.kernal.org
GNU
特点:
1、开源 C语言开发
2、代码量少 1万行左右,总大小10M以内
3、绿色软件无需安装
4、文件型数据库,可以移动。
5、数据容量最大 2T
SQL struct query language
:关系型数据库 非关系 :芒果db
ddl data defination language
建表
dml
新增 修改 删除一行 data modifty
dql
查询 data query language
查询 select
二:sql
命令
//系统维护命令
.databases //列出当前库和系统中那个文件在关联
.q or .exit // 退出
.headers on|off //Turn display of headers on or off 显示头信息的开关
.schema ?PATTERN? //列出当前指定的xxx表结构 matching PATTERN// Add --indent for pretty-printing
.tables ?TABLE? //List names of tables(列出当期数据库中的所有表)
//标准SQL语句 //所有的sql语句都以';'结尾
创建一个表:ddl create table 表名(表字段1,表字段2,...);eg:create table user(id int,name char,age int); 注意:以上表的表字段,支持如下数据类型。int text real(小数) blob(二进制数据)默认是text类型。char
----------------------------------------------------------------------
删除一个表: drop table 表名;eg:drop table user;
----------------------------------------------------------------------
向表中增加数据: insert into 表名 (字段名称 ) values (值名称);eg:insert into user (id,age) values (1,10);insert into user values(3,"wang",11);insert into user (age) values ( 12);
----------------------------------------------------------------------查询表中的数据:select 列名 from 表名 条件;eg:select * from user ; 显示表的所有的列select id from user; 显示idselect id,name from user where age <30 ;select id,name from user where name = 'lisi' ;select id,name from user where id>= 2 and id <=5;//and 和 or 和 not -----对应,用英文,不用符号 && 和 || 和 !where name like '三一' % 和 _ (通配符)like + 通配符:模糊查找%:有任意多的字符(0-任意多),eg:张三,可以 张,可以 可以%张 张%----张结尾的,,,张开头的_:有一个字符,eg:张_只能匹配张三,张__只能匹配张三三SELECT * FROM aaa WHERE name LIKE 'zhang%';ascselect *from user where age>20 or age<50 order by age desc limit 2 ;
-----------------------------------------------------------------------------修改表中数据:(不加条件的话,可能导致一列都会变)update 表名 set 表字段 = 值 满足条件:eg: update user set id = 1 where name = 'li';update user set id = 1 where name = "li" and passwd = "123";update user set id = 2 where name = "li" or name = "zhao";
--------------------------------------------------------------------------删除表中数据:delete from 表名 满足条件:eg:delete from user ; ///删除表中所有数据delete from user where id = 1; ///删除id=1 的数据;delete from user where id =1 and name = "zhang";delete from user where id = 1 or id = 2;
//插入时间列int int;
插入时间列 int int;CREATE TABLE user1(id int,name char,age int,dt datetime);'2022-07-01 19:00:00'insert into user1 values (2,'张三',23,datetime('now','+8 hours'));//该空格,有的地方不要空格
-----------------------------------------------------------------------
自动增长列sqlite> CREATE TABLE user3(id INTEGER PRIMARY(主键) KEY ASC(升序),name char,age int,dt datetime); sqlite> insert into user3 (NULL,'李四',23,datetime('now')); //在上一次的对应位置数值上自动 +1asc where (group by having) order by [desc] limit;select * from user where id<10 order by id limit 2;
三:sql
C语言
https://sqlite.org
https://sqlite.org/c3ref/intro.html
#include <sqlite3.h>
#include <stdio.h>int main(int argc, char** argv)
{sqlite3* db = NULL;char* errmsg = NULL;int ret = sqlite3_open("./aaa.db", &db);if (SQLITE_OK != ret){// 不能perrorfprintf(stderr, "open db error %s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}char sql_cmd[512] ="insert into user3 ""values(NULL,'test',110,datetime('now'));";//因为没有使用回调函数,所以 sql_cmd 只能是除了select 语句之外的其他sql语句ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);if (SQLITE_OK != ret){fprintf(stderr, "exec sql %s error %s\n", sql_cmd, errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}