Linux网络编程
昂德森科技
因为热爱,所以拼搏。
展开
-
服务器客户端poll
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <netinet.h>#include <arpa/inet.h>#include <poll.h>#include <errno.h>#define MAXLINE 80#define SERV_PORT 6666#define OPEN_MAX 1024int main(i原创 2021-10-26 19:17:03 · 108 阅读 · 0 评论 -
服务器客户端select实现
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <arpa/inet.h>#include <ctype.h>#define SERV_PORT 6666int main(int argc,char **argv){ int i,j,n,nready; int maxfd=0; int list原创 2021-10-24 14:58:52 · 1440 阅读 · 0 评论 -
服务器客户端多线程
#include <stdio.h>#include <string.h>#include <arpa/inet.h>#include <pthread.h>#include <ctype.h>#include <unistd.h>#include <fcntl.h>#define MAXLINE 8192#define SERV_PORT 8000#define INET_ADDRSTRLEN 16st原创 2021-10-24 13:52:32 · 158 阅读 · 0 评论 -
服务器客户端多进程
#include <stdio.h>#include <ctype.h>#include <stdlib.h>#include <sys/wait.h>#include <string.h>#include <strings.h>#include <unistd.h>#include <errno.h>#include <signal.h>#include <arpa/inet原创 2021-10-23 18:12:00 · 137 阅读 · 0 评论 -
服务器客户端大小写转换
server:#include <stdio.h>#include <ctype.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <pthread.h>#define S原创 2021-10-23 17:26:55 · 194 阅读 · 0 评论 -
tcp拥塞控制的个人理解
tcp为什么会发生拥塞控制,网络中的数据在传输的过程中,若对一些可用资源的需求超过了可用资源的可用部分就会发生拥塞,比如交通路口,发生了堵车的现象,要是没有交警及时处理,并且车辆之间谁都不互相避让,就会发生堵车,如果如车一直没有解决,那么交通就会瘫痪!!!tcp发生拥塞的标志就是分组数据的丢失。tcp拥塞控制算法:假定以下条件:1 数据是单方向传输的,而接受方只发送确认2 接收方总是有很大的缓存空间,所以发送方的发送窗口时根据网络拥塞程度决定的3 以tcp报文段的个数来讨论问题,而不是以字节原创 2021-09-01 21:31:31 · 94 阅读 · 0 评论 -
tcp拥塞控制的理解
tcp的拥塞控制为什么需要,因为如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。为了避免这个现象我们引入了一个滑动窗口,每当接收方的与发送方发送数据的时候我们就告诉发送方剩余缓存中空间的大小,以便于发送方的发送控制,但这个有时候出现一种死锁的问题,接收方的窗口为0,通知发送方没有空余的缓存,然后一段时间后又开始出现了多余的缓存,接收方通知发送方,但是通知原创 2021-08-23 09:43:23 · 223 阅读 · 0 评论 -
tcp为什么需要3次握手而不是2次或者4次
tcp本来就是一个恶劣的环境的环境中进行数据包的传输,tcp是运输控制的协议,IP是网络层的协议,tcp主要在数据头部封装数据的格式,ip是在数据包的头部封装接收端的地址,以至于数据包知道往哪里发,然后如果出现了阻塞失真还可以重复发1 防止失效的连接请求报文段被服务端接收,从而产生错误。2 若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服原创 2021-08-22 16:30:03 · 288 阅读 · 0 评论 -
Linux网络项目
服务器端:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<string.h>#include<pthread.h>#include<sys/epoll.h>#include<ctype.h>#include<sys/socket.h原创 2021-08-10 13:33:08 · 177 阅读 · 1 评论 -
libevent的安装配置,以及例子
如何安装libevnt那?1 首先在虚拟机里面访问libevent的官网 https://libevent.org2 cd到下载的目录下3 tar -zxvf libevent-2.1.8-stable.tar.gz 解压压缩包,解压后有一个目录:进入这个目录可以看到解压后的文件:4 .执行/configure命令 检查安装环境 生成 makefile5 执行make命令 生成 .o 和 可执行文件6 执行sudo make install 将必要的资源cp置系统指定目录。7 进入原创 2021-08-08 11:31:26 · 276 阅读 · 0 评论 -
线程池描述结构体
基于上篇文章线程池描述的结构体分析:struct threadpool_t { pthread_mutex_t lock; /* 用于锁住本结构体 */ pthread_mutex_t thread_counter; /* 记录忙状态线程个数de琐 -- busy_thr_num */ pthread_cond_t queue_not_full; /* 当任务队列满时,添加任务的线程阻塞,等待此条件变量 */ pt原创 2021-08-07 10:44:36 · 131 阅读 · 0 评论 -
线程池模型原理分析
普通server端处理客户端的数据,客户端有数据开启一个线程,最后再把线程回收,但是这样耗费资源,时间长我们利用线程池,线程池在服务器与客户端连接建立之前就已经创建,服务器内部有一块公共的区域,在客户端没有数据发送来的时候,线程池阻塞无数据阻塞:在客户端有数据的时候,服务器先发信号唤醒阻塞的线程池线程池在创建之前,要注意能创建处理线程的最大数目和最小数目,线程中忙碌的数目,假如一个服务器有一段时间只有很好的数据要处理,那就要考虑对线程池瘦身,否则扩容,这就类似于银行系统在晚上的后半夜几乎很少有数原创 2021-08-07 10:32:49 · 360 阅读 · 0 评论 -
epoll的ET非阻塞模式
readn调用的阻塞,比如设定读500个字符,但是只读到498,完事儿阻塞了,等另剩下的2个字符,然而在server代码里,一旦read变为readn阻塞了,它就不会被唤醒了,因为epoll_wait因为readn的阻塞不会循环执行,读不到新数据。有点死锁的意思,差俩字符所以阻塞,因为阻塞,读不到新字符。LT(level triggered):LT是缺省的工作方式,并且同时支持block和no-block socket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操原创 2021-08-06 08:43:23 · 797 阅读 · 0 评论 -
epoll非阻塞IO
epoll的非阻塞IO模式,利用边沿触发模式,同时修改read()函数模式为非阻塞读取,这样在减少epoll_wait()函数调用的同时也实现了水平触发的效果,是对epoll最优的模式。服务器端:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/types.h>#include<string.h>#incl转载 2021-07-17 10:02:49 · 629 阅读 · 0 评论 -
边沿触发与水平触发
假设客户端有1000b的数据,服务器端通过epoll只读了500b的数据,缓冲区还有500b,epoll read完后应不应该被触发那,答案是两种触发都可以,触发不触发都可以。比如老师给你说你要完成作业,老师见你一次给你说一次,直到你把作业写完,这就是水平触发,老师如果只给你说一次,你爱写不写,这就是边沿触发。做不做是你自己的事情。epoll select poll不仅适用于socket套接字,而且适用于管道和文件。...原创 2021-07-17 08:58:49 · 186 阅读 · 0 评论 -
VMware三种模式
Vmware下虚拟机有三种网络模式配置:1 NAT模式:是通过共享ip对外访问,一般安装好虚拟机后我们的物理机会默认开启一个虚拟网卡在虚拟机里面有一个虚拟网络编辑器:可以看到VMnet0是桥接模式,VMnet1是仅主机模式,VMnet8是NAT模式。我们也可以通过查看虚拟网卡配置:物理机要是能联网,NAT模式下的虚拟机也可以联网2 桥接模式:需要物理机和虚拟机的IP地址在同一网段物理机IP地址:虚拟机IP地址:这两个C类地址是在同一网段上的。...原创 2021-07-16 20:37:51 · 760 阅读 · 0 评论 -
poll函数的分析
poll函数和select实现的功能差不多,poll的作用是把当前的文件指针挂到等待队列。外文名poll作 用把当前的文件指针挂到等待队列函数原型:#include <poll.h>int poll(struct pollfd fds[], nfds_t nfds, int timeout);struct pollfd {int fd; /*文件描述符*/short events; /* 等待的需要测试事件 */short revents; /* 实际发生了的事件,也就是原创 2021-07-16 07:50:42 · 459 阅读 · 0 评论 -
select函数的分析
select函数位于头文件#include <sys/select.h> 。该函数用于监视文件描述符的变化情况——读写或是异常。可以理解为服务器端在内核通过select函数来处理客户端的需求。为什么需要select函数那?假如你的程序要和许多客户端进行通信,难道你会开启很多线程或者进程吗,这样只会大大降低CPU的利用率,所以select函数可以实现一个线程记录IO流的状态来同时管理多个IO。poll,epoll等也可实现此功能。select函数的源码:/* According to原创 2021-07-15 22:39:58 · 605 阅读 · 0 评论