网络编程
文章平均质量分 56
m0_46598535
这个作者很懒,什么都没留下…
展开
-
数据结构——知识大总结
mmm原创 2022-07-12 11:16:43 · 103 阅读 · 0 评论 -
计算机网络知识总结
计算机网络原创 2022-07-11 15:46:29 · 141 阅读 · 0 评论 -
listen
//一:listen()队列剖析//listen():监听端口,用在 TCP连接 中的 服务器端 角色;客户端不能用,udp不能用//listen()函数调用格式://int listen(int sockfd, int backlog);//要理解好backlog这个参数,我们需要先谈一谈 “监听套接字 队列”的话题;//(1.1)监听套接字的队列//对于一个调用listen()进行监听的套接字,操作系统会给这个套接字 维护两个队列;//a)未完成连接队列 【保存连接用的】 //客户端原创 2020-08-19 16:27:07 · 419 阅读 · 0 评论 -
listen、accept
//一:listen()队列剖析//listen():监听端口,用在 TCP连接 中的 服务器端 角色;客户端不能用,udp不能用//listen()函数调用格式://int listen(int sockfd, int backlog);//要理解好backlog这个参数,我们需要先谈一谈 “监听套接字 队列”的话题;//(1.1)监听套接字的队列//对于一个调用listen()进行监听的套接字,操作系统会给这个套接字 维护两个队列;//a)未完成连接队列 【保存连接用的】 //客户端原创 2020-08-19 15:58:07 · 183 阅读 · 0 评论 -
线程池的好处 以及线程的安全和不安全
为什么要用线程池:减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。new Thread 缺点每次new Thread新建对象性能差.原创 2020-06-14 23:49:22 · 761 阅读 · 0 评论 -
ET\LT
ET\LT原创 2020-06-10 18:31:31 · 76 阅读 · 0 评论 -
网络编程--多线程和多进程的选择
多线程还是多进程的选择及区别1)需要频繁创建销毁的优先用线程原因请看上面的对比。这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的2)需要进行大量计算的优先使用线程所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。这种原则最常见的是图像处理、算法处理。3)强相关的处理用线程,弱相关的处理用进程什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。一般的Server需要完成如下任务:消原创 2020-05-29 23:38:25 · 214 阅读 · 0 评论 -
长短连接应用场景
应用场景: 长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。 而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的原创 2020-05-29 22:03:51 · 226 阅读 · 0 评论 -
网络编程---socket中关闭套接字的函数close和shutdown区别
1.函数close():释放描述符某个进程调用了close(sockfd)函数,描述符的计数就会减1,直到计数为0。当计数为0时,也就是所用进程都调用了close,这时程序会调用shutdown函数释放套接字。2.函数shutdown():断开连接有些地方见到调用了shutdown()之后接着就是close()。有种解释是:调用shutdown()只是进行了TCP断开, 并没有释放文件描述符,需要调用close()来释放。某个进程中调用了shutdown(sockfd,SHUT_RDWR)函数,其原创 2020-05-29 21:55:20 · 4583 阅读 · 1 评论 -
网络编程--同步、互斥;并发、并行、串行
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。并发:不同的代码块交替执行;交替做不同事情的能力并行:不同的代码块同时执行;同时做不同事情的能力;比如两个程序跑在不同cpu上例子:比如,我正在打游戏,现在有电话打进来,有个快递原创 2020-05-28 21:06:02 · 221 阅读 · 0 评论 -
网络编程--TCP是如何保证包的顺序传输
主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。具体步骤如下:(1)为了保证数据包的可靠传递,发送方必须把已发送的数据包保留在缓冲区;(2)并为每个已发送的数据包启动一个超时定时器;原创 2020-05-28 18:42:17 · 633 阅读 · 0 评论 -
网络编程--自旋锁 互斥锁 读写锁 递归锁
自旋锁 互斥锁 读写锁 递归锁自旋锁:互斥锁:1.自旋锁不会睡眠,互斥锁会睡眠,因此自旋锁效率高于互斥锁。------自旋锁比较适用于锁使用者保持锁时间比较短的情况2.自旋锁消耗cpu:由于一直查询,所以自旋锁一直占用cpu,互斥锁不会,自旋锁导致cpu使用效率低3.自旋锁容易造成死锁-------比如递归调用递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂"自旋",也无法获得资源,从而原创 2020-05-27 13:40:30 · 221 阅读 · 0 评论 -
网络编程---条件变量和信号量、锁
条件变量和信号量的区别:(1)使用条件变量**(broadcast**)可以一次唤醒所有等待者,而这个信号量没有的功能,感觉是最大区别。---------应用场景:当程序退出要唤醒所有线程时,线程池的线程用条件变量;单一线程用信号量;仅有互斥量的线程设置某个线程退出的标志;(2)信号量是有一个值(状态的),而条件变量是没有的,没有地方记录唤醒(发送信号)过多少次,也没有地方记录唤醒线程(wait返回)过多少次。信号量由于把信号值+1,就不管了;而条件变量是singnal一个等待的线程,如果没有线程原创 2020-05-27 13:14:25 · 292 阅读 · 0 评论 -
网络编程--recv、send函数
函数原型:int recv(int sockfd, void *buf, int len, int flags)函数功能:用来接收远程主机通过套接字sockfd发送来的数据,并把这些数据保存到数组buf中。参数说明:(1) sockfd:建立连接的套接字(2) buf:接收到的数据保存在该数组中(3) len:数组的长度(4) flags:一般设置为0返回值说明:0 : 表示执行成功,返回实际接收到的字符个数= 0 : 另一端关闭此连接< 0 : 执行失败,可以通过errno来捕原创 2020-05-26 16:27:06 · 333 阅读 · 0 评论 -
网络编程--信号量和条件变量 唤醒丢失事件
什么是唤醒丢失答:有空闲线程 ,有没有可能我这里调用 pthread_cond_signal(),但因为某个时刻线程曾经全忙过,没有阻塞在wait,导致本次调用 pthread_cond_signal()并没有激发某个线程的pthread_cond_wait()执行呢?//我认为这种可能性不排除,这叫 唤醒丢失。如果真出现这种问题,我们如何弥补?如何弥补唤醒丢失?//如果有空闲线程,并且 接收消息队列中超过5条信息没有被处理,则我总感觉可能真的是 唤醒丢失//唤醒如果真丢失,我是否考虑这里多唤原创 2020-05-26 00:55:43 · 305 阅读 · 0 评论 -
线程数设置和CPU数的关系、CPU密集度,I/O密集度
一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)如果是CPU密集型应用,则线程池大小设置为N+1如果是IO密集型应用,则线程池大小设置为2N+1(因为io读数据或者缓存的时候,线程等待,此时如果多开线程,能有效提高cpu利用率)如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许合理,具体还需自行测试验证。但是,IO优化中,这样的估算公式可能更适合:最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目因为很显然,线程.原创 2020-05-24 19:03:57 · 996 阅读 · 0 评论 -
进程和线程
关于进程和线程:进程:进程是操作系统进行资源分配(包括CPU,内存,磁盘IO)的最小单元进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成。进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程线程是CPU调度和分配的基本单位,是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。主执.原创 2020-05-24 17:07:52 · 73 阅读 · 0 评论 -
TCP中已有SO_KEEPALIVE选项,为什么还要在应用层加入心跳包机制??
https://www.zhihu.com/question/40602902原创 2020-05-24 12:29:04 · 195 阅读 · 0 评论 -
网络编程--TCP和UDP编程区别、socket
TCP编程的服务器端一般步骤是: 1、创建一个socket,用函数socket(); 2、设置socket属性,用函数setsockopt(); * 可选 3、绑定IP地址、端口等信息到socket上,用函数bind(); 4、开启监听,用函数listen(); 5、接收客户端上来的连接,用函数accept(); 6、收发数据,用函数send()和recv(),或者read()和write(); 7、关闭网络连接; 8、关闭监听;TCP编程的客户端一般步骤是: 1、创建原创 2020-05-24 12:19:39 · 365 阅读 · 0 评论 -
网络编程--UDP如何实现可靠传输
UDP如何实现可靠传输参考文献UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多,因为即使丢失少量的包,也不会对接受结果产生较大的影响。传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。最简单的方式是在应用层模仿传输层TCP的可靠性传输。下面不考虑拥塞处理,可靠UDP的简单设计。1、添加seq/ack机制,确保数据发送到对端2、添加发送和接收缓冲区,主要原创 2020-05-24 11:44:21 · 449 阅读 · 0 评论