- 博客(77)
- 收藏
- 关注
原创 asio几种异步编程模型
0. 前置知识asio中io_server是一个很重要的东西,任何操作都需要它,在异步编程的时候,需要io_server.run()启动, 有点像事件驱动模型中的 event.loop().(原理不一样,只是说编程类似)1. 一个io_server和一个线程就是主线程一个io_server.run(),这样加入这里面有三个回调函数调用,如果第一个响应了,正在处理过程中,第二个回调函数响...
2019-10-15 21:20:56
732
原创 protobuf不能单独发送一个0
1. protobuf使用过程中遇到一个问题,记录一下定义消息如下message RegisterResponse{ int32 result=1; // 1表示成功,>1表示账号重复,注意不能为0}在服务端使用asio库如下res.set_result(0); // 注意这里把result设置为0...string send_str;res.SerializeTo...
2019-10-11 19:19:53
1559
原创 网络编程协议设计与protobuf反射
1. 问题最近在想tcp连接传输信息中应用层协议如何设计, 普遍的有两种: 加结束符和加头部信息,能不能不加头部信息?..貌似不行2. 协议头协议头必备的两个元素就是长度len, 类型type, 假设占8字节,在客户端和数据封装到一块,发送到服务端,服务端每次先接受8字节,获得类型和长度后,在读取len字节, 根据类型处理.3. protobuf反射机制protobuf能方便定...
2019-10-11 09:45:50
340
原创 线程函数为类函数时
1. 把函数定义为静态thread t(bind(Object::func,a));2. 加thisthread t(bind(Object::func,this,a));
2019-10-10 10:27:32
204
原创 unterminated conditional directive错误
#ifndef XXX#define XXX.........#endif可能是没写#endif在有#endif的情况下还报错,是头文件互相包含的问题
2019-09-22 23:14:51
16801
原创 tcp C/S模型 3个必要设置:SO_REUSEADDR,SIGPIPE,TCP_NODELAY
1. SO_REUSEADDR设置套接字的SO_REUSEADDR选项一般来说,客户端调用close()后会进入TIME_WAIT状态, 监听的端口仍被占用着,SO_REUSEADDR是让端口释放后立即就可以被再次使用。2. SIGPIPE忽略SIGPIPE信号连接建立,若某一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGP...
2019-09-14 12:13:10
398
原创 C(m,n)的计算,杨辉三角
在牛客上遇见这道题, 需要计算C(m,n),就是概率论中的:在m个数中取n个,一共有几种情况 ,看到参考答案,有必要记录一下long long c[105][105];const int mod = 1000000007;void init(){ c[0][0]=1; for(int i=1;i<=100;i++){ c[i][0]=1; ...
2019-09-05 18:50:03
5250
原创 关于右值引用的一些理解
右值引用之前看过不少次了,但过一段时间就忘了,这里简单整理一下我的理解右值引用主要用来实现 移动语义 和 完美转发1. 移动语义使用上可以用std::move() ,把参数强制转换成右值我理解就是和浅拷贝很像,不过浅拷贝是多个指针指向堆上的空间,可能会重复释放从而出错,而移动语义是只有一个指针占有堆上的空间,移动后源指针就置空了.如果没有堆上的空间,那移动语义和浅拷贝就没什么区别...
2019-09-03 12:06:37
282
原创 nginx+uwsgi启动和关闭
1. Nginx 开启nginx -c /home/www/nginx.conf-c是指定配置文件,不然用默认的配置,后面的文件路径最好从根目录开始,不然会有一个默认目录,试一下就知道了2. Nginx 关闭:nginx -s stop3. Uwsgi 开启uwsgi -d --ini uwsgi.ini-d是表示在后台运行,都试一下就知道什么意思了4. Uwsig ...
2019-08-27 09:40:36
2232
原创 git入门-官方教程《Pro Git》简单总结
文章目录置顶一、起步1. 配置2. license二、git基础1. 获取 Git 仓库2. 记录每次更新到仓库3. 查看提交历史,git log4. 撤消操作5. 远程仓库的使用,git remote6. 打标签,git tag三、git分支1. 分支简介2. 分支的新建与合并,git checkout3. 分支管理,git branch4. 远程分支,git fetch push pull5....
2019-08-25 15:05:36
857
原创 48.muduo学习笔记之example_聊天服务器例子
1. 说明本例子是与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能。代码位于 examples/asio/chat/一共有四个版本的服务器server.cc 单线程server_threaded.cc 多线程TcpServer,并用mutex来保护共享数据mutexserver_threa...
2019-08-21 11:05:21
723
原创 47.muduo学习笔记之example_下载文件例子
说明这个例子源码位于作者的源代码文件夹下examples/filetransfer文件下下实现一个发送文件的命令行小工具,这个工具的协议很简单,在启动时通过命令行参数指定要发送的文件,然后在 2021 端口侦听,每当有新连接进来,就把文件内容完整地发送给对方。可以直接用telnet测试,只是服务器把文件发过去后,直接在控制台输出发送完就调用shutdownWrite()关闭...
2019-08-21 11:04:39
649
原创 46.muduo学习笔记之example_discard例子
1. 说明discard是连接到来时不做任何处理,代码比较短,贴在下面,后面的例子代码较长,还是自己找源码吧实际就是一个DiscardServer类,有EventLoop* 和 TcpServer对象,重写连接到来函数和消息到来函数2. 代码/* 收到消息不做任何处理 */#include<muduo/base/Logging.h>#include<...
2019-08-21 11:03:25
311
原创 45.muduo学习笔记之http_HttpServer.{h&cc}
1. 说明Http服务器一个HttpServer类,不可复制,使用了HttpRequest,HttpResponse,EventLoop,InetAddress,TcpServer类2. 变量类型定义HttpCallback,回调函数TcpServer server_;Tcp服务HttpCallback httpCallback_;回调函数3. ...
2019-08-21 11:02:01
309
原创 44.muduo学习笔记之http_HttpContext.{h&cc}
1. 说明Http协议解析类一个HttpContext类,可复制,使用了Buffer,HttpRequest类2. 变量枚举类型HttpRequestParseState,四种请求头的解析状态枚举:解析请求行,请求头,内容体,解析完毕HttpRequestParseState state_;解析状态HttpRequest request_请求对象,把缓冲...
2019-08-21 11:01:27
289
原创 43.muduo学习笔记之http_HttpResponse.{h&cc}
1. 说明Http响应信息的封装一个HttpResponse类,可复制,使用了Buffer类2. 变量枚举类型HttpStatusCode,响应码的枚举std::map<string, string> headers_;响应头键值对HttpStatusCode statusCode_;响应状态码string statusMessage...
2019-08-21 10:59:11
266
原创 42.muduo学习笔记之http_HttpRequest.{h&cc}
1. 说明对Http请求的封装,这里不再说明Http请求相应的相关知识一个HttpRequest类,可复制这个Http服务器还缺很多东西,主要是为muduo的inspect监控程序提供服务,那个inspect就是对进程信息的一些监控,inspect就不做详细整理了2. 变量枚举类型Method,几种方法的枚举,muduo并没有实现全部方法Version,Http版本的枚举,...
2019-08-21 10:56:42
902
原创 41.muduo学习笔记之net_EPollPoller.{h&cc}
1. 说明一个EPollPoller类,需要了解关于epoll的相关知识,主要是三个函数epoll_create1epoll_waitepoll_ctl2. 变量类型定义EventList,epoll_event结构的列表epollfd_用epoll_create1()返回的epollfd,构造函数中就生成了events_EventList类型...
2019-08-21 10:54:27
232
原创 40.muduo学习笔记之net_PollPoller.{h&cc}
1. 说明一个PollPoller类,在muduo中主要用于调试,在DefaultPoller.cc指定是使用PollPoller还是EPollPoller2. 变量类型定义PollFdList,pollfd结构的列表pollfds_PollFdList类型,如果不懂这个的话要先学一下pollchannels_继承过来的,map<int,Channe...
2019-08-21 10:53:19
186
原创 39.muduo学习笔记之net_Poller.{h&cc}
1. 说明一个Poller类,使用了EventLoop,Channel这时候才发现这是个虚基类…那EventLoop中还使用了这个Poller…有点无语与不理解,而且EventLoop中还有调用Poller::cancel(),但是根本没这个函数…2. 变量类型定义ChannelList,Channel*列表ChannelMap,<int,Channel*>类型的...
2019-08-21 10:42:41
221
原创 38.muduo学习笔记之net_TcpClient.{h&cc}
1. 说明一个TcpClient类,包含了一个Connector对象,使用了EventLoop类noncopyable2. 变量类型定义ConnectorPtrEventLoop* loop_;不解释ConnectorPtr connector_; // avoid revealing Connector用于主动发起连接const string ...
2019-08-21 10:39:07
235
原创 37.muduo学习笔记之net_Connector.{h&cc}
1. 说明一个Connector类,使用了Channel,EventLoop,InetAddress类,功能是主动发起连接noncoayable,enable_shared_from_this这个前面说过,就不赘述了2. 变量类型定义NewConnectionCallback.EventLoop* loop_;所属的EventLoopInetAddr...
2019-08-21 10:38:29
265
原创 36.muduo学习笔记之net_Buffer.{h&cc}
1. 说明一个Buffer类非阻塞网络编程中应用层buffer是必须的,要让程序在write操作上不阻塞,网络库必须给每个tcp connection配置output buffer.在TcpConnection中使用,有两个,分别是inputbuffer和outputbuffer,TcpConnection会从socket读取数据,然后写入inputbuffer,客户代码从inp...
2019-08-21 10:04:00
262
原创 35.muduo学习笔记之net_EventLoopThreadPool.{h&cc}
1. 说明一个EventLoopThreadPool类,使用了EvevtLoop,EventLoopThread类线程池类,muduo的线程池是固定几个线程noncopyable2. 变量类型定义ThreadInitCallbackEventLoop* baseLoop_;与Acceptor所属EventLoop相同string name_;名字...
2019-08-21 10:01:02
234
原创 34.muduo学习笔记之net_TcpServer.{h&cc}
1. 说明一个TcpServer类,这个需要配合TcPConnection类理解使用了Acceptor,EventLoop,EventLoopThreadPool,原子类noncopyable2. 变量类型定义ThreadInitCallbackConnectionMap枚举类型kNoReusePortkReusePortEventLoop* loop...
2019-08-21 09:59:57
286
原创 33.muduo学习笔记之net_TcpConnection.{h&cc}
1. 说明一个TcpConnection类,代码有点长使用了Channel,EventLoop,Socket,Buffer类继承noncopyable,enable_shared_from_this,把当前对象转换成share指针,在connectEstablished()中有用到在连接到来,创建一个TcpConnection对象,立刻使用shared_ptr来管理,引用计数为1.在Ch...
2019-08-21 09:58:48
441
原创 32.muduo学习笔记之net_Acceptor.{h&cc}
1. 说明一个Acceptor类,用于accept接受TCP连接使用了EventLoop,InetAddress,Socket,Channel类Acceptor的socket是listening socket(即server socket).Channel用于观察此socket的readable事件,并回调Acceptor::handleRead(),后者调用accept来接受新连接,并回...
2019-08-21 09:57:49
296
原创 31.muduo学习笔记之net_EventLoopThread.{h&cc}
1. 说明任何一个线程,只要创建并运行了EventLoop,都称之为IO线程,为了方便使用,定义了EventLoopThread类,封装了IO线程.EventLoopThread创建了一个线程,在线程函数中创建了一个EventLoop对象并调用EventLoop::loop使用了EventLoop类noncopyable2. 变量类型定义ThreadInitCallback...
2019-08-21 09:51:45
270
原创 30.muduo学习笔记之net_Channel.{h&cc}
1. 说明一个Channel类, 是selectable IO channel,负责注册与响应IO事件,它不拥有file descriptor.它是Acceptor,Connector,EventLoop,TimeQueue,TcpConnection的成员,生命周期由后者控制2. 变量类型定义EventCallbackReadEventCallback,两种不同的回调函数...
2019-08-21 09:49:31
340
原创 29.muduo学习笔记之net_EventLoop.{h&cc}
1. 说明一个EventLoop类,任何一个线程,只要创建并运行了EventLoop,都称之为IO线程(为了方便使用,定义了EventLoopThread类,封装了IO线程)使用了Channel,Poller,TimerQueue,Timestamp类noncopyable2. 变量类型定义FunctorChannelListlooping_; /* atomic ...
2019-08-21 09:39:24
261
原创 28.muduo学习笔记之net_TimerQueue.{h&cc}
1. 说明用于定时器事件的内部类,用户看不到这个类,这个类维护了一个定时器列表这个文件有一个TimerQueue类,使用到了EvenLoop,Timer,TimerId,Channel类noncopyable定时器使用了timerfd_*系列函数,因为这个系列不会产生信号,在多线程程序中处理信号比较麻烦,这个是当做文件描述符处理,当时间到的时候,这个描述符就变为可读,方便用poll等方式...
2019-08-21 09:38:41
259
原创 27.muduo学习笔记之net_TimerId.{h&cc}
1. 说明用于定时器事件的类,三个定时器相关类中,用户只能看到这个类这个文件有一个TimerId类,就是标识某个定时器noncopyable2. 变量timer_Timer*类型sequence_序列声明TimerQueue是友元类3. 函数构造函数初始化timer_和sequence_...
2019-08-21 09:37:40
272
原创 26.muduo学习笔记之net_Timer.{h&cc}
1. 说明用于定时器事件的内部类,用户看不到这个类这个文件有一个Timer类,使用原子操作Atomic.h和时间戳类Timerstamp.hnoncopyable这个类只是定时器的抽象,并没有调用定时器函数2. 变量callback_TimerCallback类型,回调函数,具体看Callback.hexpiration_时间戳对象,超时时刻interval_...
2019-08-21 09:36:29
228
原创 25.muduo学习笔记之net_Socket.{h&cc}
1. 说明一个socket类,用RAII方法封装socket fd2. 变量sockfd_套接字fd,构造函数中赋值3. 函数构造赋值sockfd_析构调用close()关闭sockfd_fd()返回sockfd_getTcpInfo(struct tcp_info* tcpi)获得tcp信息保存到tcpi中,这是一个结构体,在...
2019-08-21 09:35:41
308
原创 24.muduo学习笔记之net_SocketsOps.{h&cc}
1. 说明没有类,关于sockets的一些函数2. sockets命名空间createNonblockingOrDie(sa_family_t family)生成非阻塞套接字,返回fd,实际就是调用socket()connect(int sockfd, const struct sockaddr* addr);就是对connect()的封装bindOrDie(...
2019-08-21 09:32:58
251
原创 23.muduo学习笔记之net_InetAddress.{h&cc}
1. 说明有一个地址类InetAddress,对IPv4或IPv6地址的封装可复制的2. 变量联合体类型的addr_/addr6_保存IPv4或IPv6地址3. 函数几个构造函数就是看是否是IPv6,和对addr_的赋值StringArg是base库中StringPiece中的一个类,就是对char*类型的封装family()返回addr_.sin...
2019-08-21 09:32:18
413
原创 22.muduo学习笔记之net_Endian.{h&cc}
1. 说明没有类,就是命名空间的一些函数定义字节序转换函数的封装,就是让名字更容易理解…除了htonl等都不是POIXS的,都是Linux特有的,而POIXS系列函数在windows下也可使用2. sockets命名空间hostToNetwork64(uint64_t host64)64位主机字节序转换为网络字节序其他类似,很好理解...
2019-08-21 09:31:39
280
2
原创 21.muduo学习笔记之net_Callback.{h&cc}
1. 说明这个主要是回调函数类型声明吧这个文件没有类,主要是一些声明和类型定义分两个命名空间,muduo和net2. muduo命名空间1. 声明using std::placeholders::_1;C++11新特性:占位符,一般和bind联合使用.bind的时候有参数的话,之前是直接传变量,有占位符后,就可以在用到时候再穿参数2. 函数get_pointer...
2019-08-21 09:31:01
387
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人