1.多播与广播
多播与组播:单播方式只能发给一个接收方,组播只有加入到多播组的主机才能接收到数据。传输层使用udp协议,发送:创建套接字:SOCK_DGRAM,填充组播地址,通过sendto发送组播包 接受:创建套接字:SOCK_DGRAM 加入多播组:struct ip_mreq; ,INADDR_ANY; IP_ADD_MEMBERSHIP; 填充组播地址,绑定组播地址
广播:同时发给局域网中所有主机,传输层使用udp协议 发送:创建套接字SOCK_DGRAM设置套接字允许发送广播包,填充地址,发送 。 接受:创建套接字,填充IP,port口号通过recvfrom接收。
2.tcp粘包:TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。
(1)发送方原因
TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:
只有上一个分组得到确认,才会发送下一个分组
收集多个小分组,在一个确认到来时一起发送
Nagle算法造成了发送方可能会出现粘包问题
(2)接收方原因
TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。
解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成
3.数据库 :当系统数据量大,或者用户访问量大时,应用程序还需要解决数据的完整性,一致性以及安全性等系列问题。 .db删库
sqlite:小型快速,自包含,高可靠性功能齐全的SQL 。.help(帮助) .quit(退出).database(显示当前打开的数据库文件).tables(显示数据库中所有表名).schema(查看表的结构)。数据库打开sqlite3<数据库名>.db。创建数据库表create table table_name(column1 datatype,column2 datatype) columnN:字段名 datatype:字段名类型 NULL(NULL值) INTEGER(整数)REAL(浮点数)TEXT(字符串)BLOB(二进制数)插入insert into table_name(value1,value2)。选取指定列 select column1,column2,columnN from table_name; 查询所有列 select *from table_name 显示列的名字.headers on 按照列显示.mode column 。where语句用于指定从一个表获取数据的条件 select * from students where age < 25 and score > 60;更新数据 UPDATE table_name set column1 = value,column2 = value2 。删除记录delete from table_name where【condition】;删除数据库表drop table info2;
代码实现:
4.网络电子词典项目 基于tcp,服务端使用多进程并发实现多个客户请求服务器接受客户端的注册请求,将用户名密码加入到用户注册表中。服务器接受客户端登陆请求将用户名密码与sqlite3数据库中对比。登录成功后开启单词解释和历史记录功能。接受到单词解释后在数据库中查询,接受到历史记录后打开文件读取
client
do_client
server.c