多线程网络编程
freshman94
这个作者很懒,什么都没留下…
展开
-
Linux多线程服务端编程学习(一):多线程日志库的设计
...原创 2019-03-20 23:29:37 · 621 阅读 · 0 评论 -
Linux多线程服务端编程学习(七):TCP客户端的设计
前文一般是由客户端主动发起连接,而主动发起连接就比被动接受连接要复杂一些,一方面是错误处理麻烦,另一方面是要考虑重试。发起连接的基本方式是调用connect,当socket变得可写时,表明连接建立完毕,但其中要处理各种错误,要判断连接是否建立成功。实现中我们将其封装为Connector类,需要注意的几个地方是:用于建立连接的socket是一次性的,一旦出错,就无法恢复,只能关闭重来。但Co...原创 2019-03-29 09:43:03 · 245 阅读 · 0 评论 -
log4j的8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)
原文地址 https://blog.csdn.net/shiyong1949/article/details/52643711log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。ALL 最低等级的,用于打开所有日志记录。TRACE designates fin...转载 2019-04-11 11:43:31 · 198 阅读 · 0 评论 -
Linux多线程服务端编程学习(八):压力测试
本篇文章将测试网络库的吞吐量和并发事件处理效率,源码的地址为:https://github.com/freshman94/NetLib用ping pong协议测试网络库在单机上的吞吐量简单地说,ping pong协议是客户端和服务器都实现echo协议。当TCP连接建立时,客户端向服务端发送一些数据,服务器会echo回这些数据,然后客户端再echo回服务器。这些数据就会像乒乓球一样在客户端和服务...原创 2019-04-01 11:02:53 · 408 阅读 · 0 评论 -
Linux多线程服务端编程学习(五):多线程HTTP静态服务器
前言首先,介绍几个类用于封装HTTP请求和响应。HttpRequestHttpparserHttpResponseHttpRequest类HttpRequest用于封装HTTP请求,它的成员变量为: enum Method{ Invalid, Get, Post, Head, Put, Delete}; enum Version{ Unknown, Http10, Http11...原创 2019-03-23 22:08:11 · 516 阅读 · 0 评论 -
非阻塞I/O
I/O缓冲区特性可整理如下:I/O缓冲区在每个TCP套接字中单独存在;I/O缓冲区在创建套接字时自动生成;即使关闭套接字也会继续传送输出缓冲区中遗留的数据;关闭套接字将丢失输入缓冲区中的数据。阻塞/非阻塞读阻塞读(read, recv, msgrcv的行为):如果没有数据,会一直等待;有数据时候会读到用户指定的缓存区,但是如果数据量比较少,少于参数指定的大小,read也会立即...原创 2019-03-26 22:57:59 · 234 阅读 · 0 评论 -
Linux多线程服务端编程学习(六):基于timerfd实现定时器
本篇文章源码的地址为:https://github.com/freshman94/NetLib在这一节中,我们会实现一个定时器,为反应器EventLoop增加定时回调函数的功能。实现定时器的关键类有:TimerTimerQueueTimer类Timer实现了一个定时器结点,其核心成员变量为: const TimerCallback callback_; Timestamp exp...原创 2019-03-26 20:47:43 · 563 阅读 · 0 评论 -
时间函数与定时器timerfd
时间结构体struct timeval{__time_t tv_sec; //Seconds.__suseconds_t tv_usec; //Microseconds.};struct timespec {time_t tv_sec; // secondslong tv_nsec; // nanoseconds};struct tm { int t...原创 2019-03-26 19:09:43 · 862 阅读 · 1 评论 -
Linux多线程服务端编程学习(四):muduo库的网络模型与实现原理
简介muduo是基于Reactor模式的网络库,其核心是个事件循环EventLoop,用于响应IO事件。muduo不考虑移植性,不跨平台,只支持Linux,只支持TCP,其网络模型为非阻塞IO + one event loop per thread。何为one event loop per thread?首先,先简要解释一下reactor模式。Reactor模式应用于同步I/O的场景。我们以...原创 2019-03-23 12:09:21 · 591 阅读 · 0 评论 -
Linux多线程服务端编程学习(三):非阻塞网络编程中应用层Buffer的必需性
本文的内容参照了陈硕先生的muduo网络库原因问题一:在非阻塞网络编程中,为什么要使用应用层发送缓冲区?假设应用程序需要发送40KB的数据,但操作系统的内核发送缓冲区只有25KB的剩余空间,那么剩下的15KB数据怎么办?如果等待OS缓冲区可用,会阻塞当前线程,因为不知道对方什么时候收到并读取数据。因此网络库应该把15KB数据缓存起来,放到这个TCP链接的应用层缓冲区中,等socket变得可写...原创 2019-03-21 23:12:36 · 394 阅读 · 0 评论 -
Linux多线程服务端编程学习(二):封装互斥量与线程
本文的内容主要参照了陈硕先生编写的muduo网络库互斥量使用RAII的手法封装互斥量,避免因忘记解锁造成的死锁问题。#include <base/noncopyable.h>#include <assert.h>#include <pthread.h>class MutexLock : noncopyable {public: MutexLoc...原创 2019-03-21 20:26:33 · 195 阅读 · 0 评论 -
muduo中实现Protobuf编解码器codec与消息分发器dispatcher
前言Google Protocol Buffers(简称Protobuf)是一款非常优秀的库,它定义了一种紧凑(相对XML和JSON而言)的可扩展二进制消息格式,特别适合网络数据传输。在网络编程中使用Protobuf需要解决以下两个问题:长度。Protobuf打包的数据没有自带长度信息或终结符,需要由应用程序自已在发生和接收的时候做正确的切分。类型。Protobuf打包的数据没有自带类型...原创 2019-04-15 22:05:41 · 1122 阅读 · 0 评论