C++网络编程踩坑记
文章平均质量分 78
真正的学徒都有一颗大师的心
不要这么容易就想放弃
展开
-
C++网络编程I/O 多路复用之epoll(二)
最后再谈一谈吧,epoll不是单独使用,学习到了epoll在是开始,后面还有线程池,反应堆模型,协议解析,数据库等等一大堆的内容,尽管这样做出来的东西在企业看来仍然是小儿科,就问你难受不难受。冲冲冲!!!...原创 2022-07-14 23:09:04 · 508 阅读 · 1 评论 -
多线程程序出现段错误,找了一个礼拜,原来问题出在strlen和strrchr
想使用strrchr函数找到字符串最后的点,来获取到文件类型。比如"my.html",获取到最后的点得到".html",然后再用过strcmp判断就可以根据不同的文件类型做出不同的动作了。但出现段错误!一般来说,出现段错误,就是找内存越界,这是最常见的最容易犯错的问题,但我找了半天测试了好多模块,都没有越界,更诡异的是,判断文件类型函数加上就有问题,有函数strlen和strrchr。程序编译没问题,运行将会报错。因为NULL并不是一个字符串,所以如果strlen©会发生异常。至于为什么strlen原创 2022-07-11 17:04:23 · 1097 阅读 · 0 评论 -
C++网络编程I/O 多路复用之epoll(一)
似乎我总是这样,宁愿持续学习,也不愿意总结。就好像高中,总是跟着老师听课,但不乐于自己把老师讲的知识串起来,进行总结。这种想法其实是在自己骗自己,听了等于学会那是不可能的,不愿意总结就是因为那块知识学的还不熟练,回忆起来觉得麻烦。同时的我也知道最舒服的时候是老师讲课后题的时候,我都会,别的同学在费劲的听讲,而我可以做别的时候,也正因为这样的自大,在有些时候丢失了一些细节的关注,这是我对我中学时期学习的反思。这也是为什么说,人最爽的时刻是知识输出,把自己在脑子里建构的房子,拿出来,展示给大家,那简直就像刚刚练原创 2022-06-25 23:05:01 · 1308 阅读 · 0 评论 -
epoll才刚刚是服务器开发的开始,绝不是问题的最终解决
终于到了epoll,我以为,从多进程服务器、多线程服务器、select服务器、poll服务器、最后到epoll就是结束了。但不是这样的,提出我这阶段开发服务器的问题,希望和大家交流交流。当我做完一个epoll+http解析协议的项目时,我发现,如果回发的数据过大,比如一个4m的图片,浏览器收到的图片会是乱的,这个怎么解决啊。我找到的两种方法:服务器使用epoll,监听到好几个cfd读事件,进入for循环一个个处理cfd,如果第一个cfd1在回传一个很大的数据,是不是后面的cfd都会卡着等待,反映在浏览器端原创 2022-06-23 20:52:55 · 174 阅读 · 0 评论 -
C++网络编程I/O 多路复用之poll
学到这,感觉没什么可说的,poll 是对select 的改进,但是它是个半成品,相对 select 提升不大。更多的是把poll当成一个过渡,大家并没有给poll过多的关注,而是直接epoll了。所以着重解释了从select到poll改变了什么,思路的变化,到如何使用上其实就是调函数,也没有太多细节要注意。上节通过解释和代码,我们可以总结select的缺点主要有:解决了select的两件事情:poll也是操作系统提供的系统调用函数,机制与select类似,管理多个描述符也是进行轮询,即每次调用都要扫描整个注原创 2022-06-22 17:31:16 · 2490 阅读 · 0 评论 -
c++服务器回传给网页的中文是乱码
在做c++服务器的时候,回发给网页的中文是乱码,明明在响应消息报头指定了text/plain; charset=utf-8。服务器回传给网页的html代码里的中文是正常的,总的来说就是服务器的编码方式和浏览器的编码方式不一致,在浏览器改变编码方式也可以解决问题,但我的谷歌浏览器没找到设置编码。主要还是想寻求一种通用的方法。百思不得其解,搜索引擎上也都是关于java的,有现成的函数很方便的解决,关于c++的极少。不仅仅在响应消息报头指定编码方式,还要在html页面指定内容的编码方式。可以在响应消息报头指定原创 2022-06-19 10:52:44 · 849 阅读 · 1 评论 -
一个括号引发的bug——服务端只显示read1个
在做本地套接字连接的时候,客户端发送给服务端若干字符,但服务端显示读到的却一直是1个。查了半天,原来是括号的误用。服务端打印read返回值,不换行,还一直是1。看看代码,能看出问题吗?逻辑很清晰,就是能从客户端读到东西就一直读,然后返回处理后的数据。这是客户端的显示情况,这是客户端的代码,原因分析:先运算read(cfd,buf,sizeof(buf)),假如返回3,并没有及时赋值给ret,而是先与0进行比较,3>0为真,得到1,赋值给ret。先计算(ret=read(cfd,buf,s原创 2022-06-14 11:28:27 · 110 阅读 · 0 评论 -
libevent configure: error: openssl is a must but can not be found.error while loading shared librari
安装libevent库执行./configure 时出现以下错误执行make出现以下错误缺少opensslsudo apt install libssl-dev运行用到libevent库的程序编译hello-world.c,运行hello时,出现如下错误。在运行时,程序无法找到libevent-2.1.so.7这个动态库,因为该动态库在默认安装时,存放的路径在/usr/local/lib下,不在系统的默认查找路径内。将/usr/local/lib路径添加到/etc/ld.so.conf配置文件中添加路径.原创 2022-06-10 17:19:22 · 1561 阅读 · 0 评论 -
C++网络编程I/O 多路复用之select
I/O多路复用就是通过一种机制,一个进程可以监听多个文件描述符,这对提高程序的性能至关重要,一旦某个文件描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。 与多进程或多线程的方式相比,使用 IO 多路复用技术无需创建多个进程或线程,也不必维护这些进程/线程,从而大大减小了系统的开销。select,poll,epoll都是IO多路复用的机制。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步原创 2022-06-03 15:24:24 · 692 阅读 · 0 评论 -
C++网络编程踩坑记之多线程服务器,详解代码细节,多问为什么
前置知识:多线程知识Socket编程多线程并发服务器思路lfd=socket(),创建监听套接字 lfd。setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&opt, sizeof(opt)),设置端口复用。bind(),绑定监听套接字lfd与Strcut scokaddr_in srv_addr(服务器IP和端口)。listen(),把lfd转换成一个被动套接字,进入被动监听状态,用来被动接受来自其他主动套接字的连接请求,并设置监听上限。主线程w原创 2022-05-31 12:19:11 · 476 阅读 · 2 评论 -
Linux下调用socket的accept时,客户端强制断开 accept报错accept: Interrupted system call
项目场景:Ubunto16.04版下 使用fork创建多进程socket服务问题描述在客户端断开连接后 不论是自动断开 开始ctrl+c强制断开 都会出现accept:Interrupted system cal 从而导致服务器程序异常结束原因分析:一开始是我怀疑是fork的原因 反复调整父子线程退出的逻辑还是不行 搜索报错信息发现大多数的答案都是要像下面这样写accept函数if((connfd=accept(listenfd,NULL, NULL)) < 0) { if转载 2022-05-25 19:33:16 · 1209 阅读 · 1 评论 -
C++网络编程踩坑记之多进程服务器,详解代码细节,多问为什么
首先介绍多进程并发服务器是什么,然后按步骤描述怎么用,在最后给出完整server.c的代码,wrap.c错误处理代码,和client.c的代码。希望大佬多交流,敬请斧正。是什么:提示:这节是多进程并发服务器,其实现原理是,服务端通过lfd负责监听客户端的连接。当接受到一个客户端的连接时,建立一个子进程通过cfd与客户端进行数据通信,那么这个服务端就可以响应多个客户端。涉及到的是信号,多进程的相关知识。服务器按处理方式可以分为迭代服务器和并发服务器两类。迭代服务器:服务器每次只能处理一个客户的请原创 2022-05-25 13:46:21 · 510 阅读 · 0 评论 -
C++多线程服务器,在子线程ctrl+c后,主线程也退出了,return和exit
项目场景: 多线程服务器是对多进程服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。问题描述盲目模仿多进程服务器的写法,归根结底还是自己没有掌握多进程和多线程的区别模仿多进程服务器,写了多线程服务器。通过测试,多线程完成了多个socket连接并传输数据的任务int main(int argc,char *argv[]){ int lfd,cfd; int i=0; int ret; char b原创 2022-05-23 23:05:53 · 914 阅读 · 0 评论