Skip to content

Latest commit

 

History

History
131 lines (89 loc) · 5.72 KB

File metadata and controls

131 lines (89 loc) · 5.72 KB
  • socket 中bind用到的 sockaddr/sockaddr_in

  • port和server地址 hton, gethostbyname转换

  • read/write 函数的处理: 1.getline需要 iostream的参数, 需要从int类型的句柄构造iostream 2.直接用while加 read/write

  • string和char* 类转换 string->char *

        string str = "some string" ;
        char *cstr = &str[0u];
    

char * ->string

	  string str(char *)
	  // str.append(char *
  1. boost
  2. self define
  • 内存溢出 core dump, gdb调试 g++编译的时候加 -g选项, 在gdb里面可以进入函数, 看见代码 s 跳入函数, finish跳出, print显示 然后在单步执行的时候发现 writeHeader函数 return之后, 跳转到 内部的一个地址(某个函数吧栈中返回地址复写了) 继续追查发现是MySocket::mywrite函数里面,用了memcpy cpoy一个string的引用的时候,吧 writeHeader栈内变量内容覆写了 这个问题有由于 writesize, 这个临时变量没有处理好 由此: 以后出现这种问题, 主要查看 有memcpy, alloc relloc这这种内存操作的地方!!!

  • core dump munmap_chunk(): Invaild pointer; 这个内存泄露是 free一个无效指针,在MySocket::myread中, 用了string::append导致了这个错误 联想到是不是,在append的过程中, 会检测参数是否在堆中, append的参数在堆中会释放那块内存, 导致while循环第二次append的时候出错? 然后吧buffer定义在栈中, 没有这个问题了??? 很迷 //TODO

  • 检查了一个晚上的 内存冲突问题, 居然是 new char(BUFFSIZE)导致的 ---> new char[BUFFSIZE]

  • valgrind 内存检查

  • vector 详细

  • boost库安装的时候出了很多fail(导致后面碰到问题的时候我都以为是编译的时候出错了, 其实并不是) 问题是: 1.官方程序 lambda 编译出错 lambda::detail::operator_return_type..... template 出错argument错误 //TODO 2.官方filesystem 链接库的时候, 貌似之前已经安装过那个库, 导致一直再用之前 的版本1.60.0, 而这个版本和1.48 差别很大, 导致 -lboost_filesystem不对

  • boost::filesystem::path问题:

        const char * path_char = "/statis";
        const char * p_char = p_str.c_str();
     	  //cout<<path_str<<endl;
         path p(p_str.c_str());
         if(exists(p)){
     	if(is_regular_file(p)){
     	    ifstream fd;
     	    //cout<<path_str<<endl;  //the path_str is not the same as line 18;
     	    fd.open(p_char);
     	    cout<<p_char<<endl;
    
  • boost::filesystem::copy 怎么实现的? 为什么下面的代码就能实现遍历?

          copy(directory_iterator(p), directory_iterator(), back_inserter(v));
    
  • 感觉boost库用起来没有 标准的那么舒服, 还是自己调系统接口来的直接?

  • select pool 用法 三个FD_SET 具体有待研究! //TODO

  • threadpool 实现方法; pool对队列管理, 自定义可以assign任务的mythread, 继承task类; virtual的动态绑定!!!

  • namespace 是标识符可见范围; c++标准库都定义在std中; namespace提出, 主要是为了解决命名冲突的问题!

  • C++ 解决两个类互相引用的方法: A.h里面引用B.h, B.h 定义 class A; , B.cpp里引用A.h 但是, 为什么这样不会出现类的多次定义?

  • C++11 不能定义 void的成员函数? 实际上是, 返回为void的函数, void要显示定义

  • 对, thread(threadfunc, this)的时候, 报错

        invalid use of non-static member function
    

当时用吧方法改成static解决这个问题, 但是? stackoverflow上有对这个问题深一点的[讨论](http://stackoverflow.com/questions/29286863/invalid-use-of-non-static-member-function

  • cpp 居然不能在全局里面定义执行语句?)

  • 在 join之前调用~Thread() 导致

        terminate called without an active exception
    

设置为 detach模式可以解决这个问题. why?

	 id get_id() const noexcept;
	 Get thread id
	 Returns the thread id.
	 If the thread object is joinable, the function returns a value that uniquely identifies the thread.
	 If the thread object is not joinable, the function returns a default-constructed object of member type thread::id.
  • valgrind leak-check 和 thread detach 之间的问题

  • 加入了threadpool, 然而发现用本机测试

       ab -n 10000 -c 1000 127.0.0.1:8080/a
    

没有加入线程池的反而更快! 0.9 : 19s

  • 而且, 1 构建handler的时候, string参数没有传入, 导致request构造失败??

  • 然后, 写mythread的时候, 循环处理的函数threadfunc在处理的时候, 如果没有检测到任务会延迟0.25s再检测, 这个检测在并发的时候很关键! 吧0.25s改为0.1ms, 直接吧 10000个请求 1000并发, 时间从32降到了19;

  • 好的, 告一段落, select

  • 为什么要用select不直接accept

  • select/ pselect : 1.时间精度 2.select会改变timeout 3, pselect多了一个参数 sigmask 用select的example实现了简单的select和accept一样, 在本机上看不出来区别

  • 然后, ab测试的时候, 10000个连接总有1个2个失败的, 然后服务器就退出了, --> 错误处理做的不够!!!!