
network
zxy131072
嵌入式linux
展开
-
C实现DNS到IP地址的实现
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <netdb.h>#include <arpa/inet.h>#include <sys/socket.h>int dns2ip(const char *domain, char * ip, int len){ char **pptr原创 2020-09-27 13:16:06 · 315 阅读 · 0 评论 -
sqlite数据库操作
数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合。sqlite数据库:是一种小型的关系型轻量级的嵌入式数据库。支持数据库大小至2TB;足够小,全部源码大致3万行c代码,250KB,比目前流行的大多数数据库对数据的操作要快。1-- 安装数据库: sudo dpkg -i *.deb2-- 创建数据库 sqlite3 stu.db //不存在则创建并打开 存在打开3-- sqlite命令 系统命令 以 "."开头 普通命令 ,原创 2020-09-25 09:08:17 · 260 阅读 · 0 评论 -
UDP模型流程及其函数
服务器创建套接字 socket( )填充服务器网络信息结构体 sockaddr_in将套接字与服务器网络信息结构体绑定 bind( )进行通信 recvfrom( )/sendto( )客户端创建套接字 socket( )填充服务器网络信息结构体 sockaddr_in进行通信 sendto( )/recvfrom( )函数sendto( )#include <sys/socket.h>ssize_t sendto(int socket, const void *mes原创 2020-09-24 13:26:58 · 181 阅读 · 0 评论 -
socket网络编程TCP中C/S架构函数框架
服务器端创建套接字 socket( )填充服务器网络信息结构体 sockaddr_in将套接字与服务器网络信息结构体绑定 bind( )将套接字设置为被动监听状态 listen( )阻塞等待客户端的连接请求 accept( )进行通信 recv( )/send( )客户端创建套接字 socket( )填充服务器网络信息结构体 sockaddr_in发送客户端的连接请求 connect( )进行通信 send( )/recv( )socket( ) #include <s原创 2020-09-24 13:22:20 · 338 阅读 · 0 评论 -
网络中IP地址分类
IP地址是Internet中主机的唯一标识Internet中的主机要与别的机器通信必须具有一个IP地址IP地址为32位(IPv4)或者128位(IPv6)每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由IPV4地址的表示形式:点分十进制 如192.168.1.123 最后都会转换为一个32位的无符号整数。IP地址分类(依据ipv4地址的前八位来分)A类 0000 0000 - 0111 1111 0.x.x.x - 127.x.x.xB类 1000 0000原创 2020-09-24 13:09:38 · 319 阅读 · 0 评论 -
unix本地套接字
本地地址结构struct sockaddr_un // <sys/un.h> { sa_family_t sun_family; char sun_path[108]; // 套接字文件的路径};填充地址结构struct sockaddr_un myaddr;bzero(&myaddr, sizeof(myaddr));myaddr.sun_family = PF_UNIX; strcpy(myaddr.sun_path, “原创 2020-09-24 10:47:30 · 402 阅读 · 0 评论 -
组播
过多的广播会大量占用网络带宽,造成广在这里插入代码片播风暴,影响正常的通信。A类地址第1字节为网络地址,其他3个字节为主机地址。第1字节的最高位固定为01.0.0.1 – 126.255.255.255B类地址 第1字节和第2字节是网络地址,其他2个字节是主机地址。第1字节的前两位固定为10128.0.0.1 – 191.255.255.255C类地址前3个字节是网络地址,最后1个字节是主机地址。第1字节的前3位固定为110192.0.0.1 – 223.255.255.255原创 2020-09-24 10:36:36 · 179 阅读 · 0 评论 -
广播
只有用户数据报(使用UDP协议)套接字才能广播以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址发到该地址的数据包被所有的主机接收255.255.255.255在所有网段中都代表广播地址发送:创建用户数据报套接字缺省创建的套接字不允许广播数据包,需要设置属性setsockopt可以设置套接字属性接收方地址指定为广播地址指定端口信息发送数据包...原创 2020-09-24 10:29:21 · 308 阅读 · 0 评论 -
网络超时检测
超时检测的必要性:避免进程在没有数据时无限制地阻塞,当设定的时间到时,进程从原操作返回继续运行。方法一: 设置套接字属性 方法二: 设置select最后的一个参数:注意select调用后会清零超时结构体,需要重新设置时间方法三:使用闹钟定时器 #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction原创 2020-09-24 10:26:32 · 613 阅读 · 0 评论 -
套接字属性函数getsockopt和setsockopt
套接字属性函数int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)功能: 获得套接字属性参数: sockfd:套接字描述符 level:协议层 1)SOL_SOCKET:通用套接字选项. 2)IPPROTO_IP:IP选项. 3)IPPROTO_TCP:TCP选项. optname:选项名 SO_BROADCAST 允许发送广原创 2020-09-24 10:22:42 · 184 阅读 · 0 评论 -
网络服务器分类
循环服务器cp循环服务器:被一个客户端占用 用的少udp循环服务器:可以被多个客户端响应 用的多并发服务器:tcp并发服务器:可以响应多个客户端请求 用的多udp并发服务器:可以响应多个客户端请求 用的少tcp并发服务器------>多进程并发服务器 多线程并发服务器 IO多路复用实现并发服务器(伪并发)并发服务器的设计思想是:服务器接受客户端的连接请求后创建子进程来为客户端服务...原创 2020-09-24 10:11:26 · 477 阅读 · 0 评论 -
IO多路复用
基本思想先构造一张有关描述符的表,然后调用一个函数。当这些文件描述符中的一个或多个已准备好进行I/O时函数才返回。函数返回时告诉进程那个描述符已就绪,可以进行I/O操作。 #include <sys/time.h> #include <sys/types.h> #include <unistd.h>int select(int nfds, fd_set *readfds, fd_set *writefds, fd原创 2020-09-24 09:04:37 · 134 阅读 · 0 评论 -
网络常用调试工具使用
## ifconfig 查看网络的配置信息ifconfig eth0 查看网卡1网络的配置信息## ping 查看两台主机之间的连通性ping www.baidu.com //加域名ping 192.168.1.31 //加ip地址## lsof 查看打开的文件(应用程序)lsof -i tcp //查看tcplsof -i udp //查看udp## telnet 作为客户端测试服务器telnet ip port## netstat 测试网络状态net原创 2020-09-23 17:04:10 · 472 阅读 · 0 评论 -
UDP通信流程
server: 创建数据报套接字(socket(,SOCK_DGRAM,))--------------------->有手机 指定本地的网络信息------------------------------------------->有号吗 绑定网络信息(bind())--------------------------------------->绑定手机 接收信息(recvfrom())---------------------------------------原创 2020-09-23 16:51:48 · 661 阅读 · 0 评论 -
inet_addr和inet_ntoa函数使用
#include <stdio.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#if 0#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>typedef uint32_t in_addr_t;struct in_addr {原创 2020-09-23 16:35:12 · 470 阅读 · 0 评论 -
测试当前主机的大小端存储的方法
1、使用共用体#include <stdio.h>//使用共用体测试主机字节序union un{ int a; char b;};int main(int argc, const char *argv[]){ union un myun; myun.a = 0x12345678; printf("a = %#x\n", myun.a); printf(...原创 2020-09-24 13:17:57 · 307 阅读 · 0 评论 -
select多路IO转接
原理 =====》借助内核, select 来监听, 客户端连接、数据通信事件。相关函数 void FD_ZERO(fd_set *set); --- 清空一个文件描述符集合。 fd_set rset; FD_ZERO(&rset); void FD_SET(int fd, fd_set *set); --- 将待监听的文件描述符,添加到监听集合中 FD_SET(3, ...原创 2019-05-23 14:29:46 · 311 阅读 · 0 评论 -
多线程并发服务器
server.c过程1、 Socket(); 创建 监听套接字 lfd2、 Bind() 绑定地址结构 Strcut sockaddr_in addr;3、 Listen();4、主要业务逻辑while (1) { cfd = Accept(lfd, ); pthread_create(&tid, NULL, tfn, (void *)cfd); pthread_d...原创 2019-05-23 12:32:15 · 561 阅读 · 0 评论 -
多进程并发服务器
实现流程1、 Socket(); 创建 监听套接字 lfd2、 Bind() 绑定地址结构 Strcut sockaddr_in addr;3、 Listen(); 设置监听上限4、主业务逻辑 while (1) { cfd = Accpet(); 接收客户端连接请求。 pid = fork(); if (pid == 0){ 子进程 read(cfd) --- 小...原创 2019-05-22 18:03:18 · 640 阅读 · 0 评论 -
网络编程函数的封装
封装目的:在 server.c 编程过程中突出逻辑,将出错处理与逻辑分开,可以直接跳转man手册。【wrap.c】 存放网络通信相关常用 自定义函数。 【wrap.h】 存放 网络通信相关常用 自定义函数原型(声明)。命名方式:系统调用函数首字符大写, 方便查看man手册如:Listen()、Accept();函数功能:调用系统调用函数,处理出错场景。在 server.c...原创 2019-05-22 14:55:16 · 439 阅读 · 0 评论 -
网络应用程序设计模式
C/S模式传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。B/S模式 浏览器(broswer)/服务器(server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。优缺点对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而...原创 2019-05-20 13:29:18 · 2521 阅读 · 0 评论 -
网络的分层模型
OSI七层模型物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。数据链路层:定义了如何让格式化数据以帧为单位进行传输,以及如何控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。...原创 2019-05-20 13:36:15 · 635 阅读 · 0 评论 -
网络中数据通信过程
两台计算机通过TCP/IP协议通讯的过程如下上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下所示链路层有以太网、令牌环网等标准,链路层负责网卡设备的驱动、帧同步(即从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。交换机是工作在链路层的网络设备,可以在...原创 2019-05-20 13:48:12 · 2578 阅读 · 0 评论 -
网络编程socket
网络套接字: socket一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现。)在通信过程中, 套接字一定是成对出现的。网络字节序小端法:(pc本地存储) 高位存高地址。低位存低地址。大端法:(网络存储) 高位存低地址。地位存高地址。网路字节序转换函数htonl --> 本地-------网络 (IP) 192.168.1.11 --> string...原创 2019-05-20 14:21:54 · 216 阅读 · 0 评论 -
socket网络编程服务器端与客户端实现
服务器端server.c#include <stdio.h>#include <ctype.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdlib.h>#include <string.h>#include <unistd.h>...原创 2019-05-20 14:49:33 · 1067 阅读 · 0 评论 -
网络通讯协议图
网址网络通讯协议图原创 2019-05-24 14:12:56 · 1049 阅读 · 0 评论 -
多路IO转接poll模型
poll函数int poll(struct pollfd *fds, nfds_t nfds, int timeout); fds:监听的文件描述符【数组】 struct pollfd { int fd:待监听的文件描述符 short events:待监听的文件描述符对应的监听事件 取值:POLLIN、POLLOUT、POLLERR sh...原创 2019-05-25 08:32:48 · 186 阅读 · 0 评论 -
epoll多路IO转接模型
epoll实现多路IO转接思路1、lfd = socket(); 监听连接事件lfd2、bind();3、listen();4、int epfd = epoll_create(1024); epfd, 监听红黑树的树根。struct epoll_event tep, ep[1024]; tep, 用来设置单个fd属性, ep 是 epoll_wait() 传出的满足监听事件...原创 2019-05-25 08:59:46 · 253 阅读 · 0 评论 -
TCP通信中的三次握手与四次挥手
下图是一次TCP通讯的时序图TCP通讯时序在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一端传到网络的另一端也需要时间,所以图中的箭头都是斜的。双方发送的段按时间顺序编号为1-10,各段中的主要信息在箭头上标出,例如段2的箭头上标着SYN, 8000(0), ACK1001, ,表...原创 2019-05-22 10:56:05 · 232 阅读 · 0 评论 -
滑动窗口 (TCP流量控制)
如果发送端发送的速度较快,接收端接收到数据后处理的速度较慢,而接收缓冲区的大小是固定的,就会丢失数据。TCP协议通过“滑动窗口(Sliding Window)”机制解决这一问题。 看下图的通讯过程: 1、发送端发起连接,声明最大段尺寸是1460,初始序号是0,窗口大小是4K,表示“我的接收缓冲区还有4K字节空闲,你发的数据不要超过4K”。接收端应答连接请求,声明最大段尺寸是1024,初始序...原创 2019-05-22 14:17:43 · 749 阅读 · 0 评论 -
TCP状态转换
这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻的认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!TCP状态转换图CLOSED:表示初始状态。LISTEN:该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。SYN_SENT:这个状态与SYN_...原创 2019-05-22 14:21:44 · 128 阅读 · 0 评论 -
半关闭
当TCP连接中A发送FIN请求关闭,B端回应ACK后(A端进入FIN_WAIT_2状态),B没有立即发送FIN给A时,A方处在半连接状态,此时A可以接收B发送的数据,但是A已不能再向B发送数据。从程序的角度,可以使用API来控制实现半连接状态。 #include <sys/socket.h> int shutdown(int sockfd, int how); sockfd...原创 2019-05-22 14:24:17 · 371 阅读 · 0 评论 -
2MSL (Maximum Segment Lifetime)
2MSL (Maximum Segment Lifetime) TIME_WAIT状态的存在有两个理由:(1)让4次握手关闭流程更加可靠;4次握手的最后一个ACK是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。 (2)防止lost duplicate对后续新建正...原创 2019-05-22 14:27:11 · 3238 阅读 · 0 评论 -
端口复用
在server的TCP连接没有完全断开之前不允许重新监听是不合理的。因为,TCP连接没有完全断开指的是connfd(127.0.0.1:6666)没有完全断开,而我们重新监听的是lis-tenfd(0.0.0.0:6666),虽然是占用同一个端口,但IP地址不同,connfd对应的是与某个客户端通讯的一个具体的IP地址,而listenfd对应的是wildcard address。解决这个问题的方法...原创 2019-05-22 14:28:44 · 978 阅读 · 0 评论 -
TCP异常断开
心跳检测机制在TCP网络通信中,经常会出现客户端和服务器之间的非正常断开,需要实时检测查询链接状态。常用的解决方法就是在程序中加入心跳机制。Heart-Beat线程这个是最常用的简单方法。在接收和发送数据时个人设计一个守护进程(线程),定时发送Heart-Beat包,客户端/服务器收到该小包后,立刻返回相应的包即可检测对方是否实时在线。 该方法的好处是通用,但缺点就是会改变现有的通讯协议...原创 2019-05-22 14:30:18 · 1421 阅读 · 0 评论 -
网络名词术语解析
路由(route)路由(名词) 数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。 路由(动词) 某个路由节点为数据包选择投递方向的选路过程。路由器工作原理路由器(Router)是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号的设备。 传统地,路由器工作于OSI七层协议中的第三层,其主要任务是接收来自一个网络...原创 2019-05-22 14:32:52 · 371 阅读 · 0 评论 -
网络典型协议
协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。 假设,A、B双方欲传输文件。规定: 第一次,传输文件名,接收方接收到文件名,应答OK给传输方; 第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK; 第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。 由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A...原创 2019-05-20 13:23:53 · 410 阅读 · 0 评论