杂项

C++杂项

Visual studio

参考

  • system("pause"); 防止输出框一闪而过
  • F5 执行;F11 逐语句debug; F10逐过程
  • F9 新建断点

void*指针

  • 任何类型指针都可以转为void*,它无条件接受各种类型
  • 一般用在通用型接口的参数类型
  • 在具体使用时,需要转化为具体的指针类型

extern "C" : 告诉C++编译器这段代码使用C标准编译,使得在C和C++混编的情况下两者得以兼容

struct和type struct类型:参考

fprintf :发送格式化输出到文件流 参考

cd - 回到上一目录

UML类关系图 参考

C++ try-catch捕获异常 参考

makefile 教程

  • src源码 inc头文件 bin执行码与so文件 lib静态/动态库
  • etc配置脚本 tools/op控制与监控脚本 log日志目录

linux下.a 和.o文件:

  • .a文件:静态库,对函数库的链接是在编译期间完成的,程序运行时便和函数库无关,因为已经拷贝了
  • .o文件:动态库,库函数的链接载入推迟到程序的运行时期;可以节省资源,无需每次都载入所有的函数;而且可以实现在进程之间的资源共享

ln命令:为某一个文件在另一个文职建立一个同步的链接,类似于win下的快捷方式 参考

  • 软连接
  • 硬链接

C++中的虚函数和纯虚函数 参考

linux signal函数 参考

http协议:建立在tcp/ip之上的协议,通过TCP连接传输数据 参考

C++ epoll:参考 参考2

Socket 参考

  • timeval 结构体 参考 协议实现过程中经常会有同步时间计算获得时间延迟,一般配合gettimeofday使用
struct timeval
  {
    __time_t tv_sec;		/* Seconds.  */
    __suseconds_t tv_usec;	/* Microseconds.  */
  };

#include <iostream>
#include "sys/time.h"

int main()
{
    struct timeval tv_b, tv_d;
    unsigned long long timeconsumed = 0;
    gettimeofday(&tv_b, NULL);
    for(int i=0;i<100000;i++){}
    gettimeofday(&tv_d, NULL);
    timeconsumed = tv_d.tv_sec - tv_b.tv_sec + (tv_d.tv_usec - tv_b.tv_usec)/1000000;
    
    std::cout << tv_d.tv_usec - tv_b.tv_usec << std::endl;
    return 0;
}
  • string assign方法:将原字符串清空,然后赋予新值进行替换

  • struct in_addr:表示一个32位的ipv4地址 参考

    • 网络字节序:32位的unsigned int,每8位表示IP地址中一个数值;采用大端序(数据的高位在低地址)
struct in_addr {
    in_addr_t s_addr;
};
  • string c_str():参考 将一个string转换成const* char(C语言风格的字符串)
#include <iostream>
#include <string.h>

int main()
{
    std::string s = "1234";
    char *p;
    // p = s.c_str()   //错误
    p = new char[s.size() + 1];
    strcpy(p, s.c_str());

    std::cout << p << std::endl;
    delete[] p;
    return 0;
}
输出
1234
  • inet_ntoa和inet_aton: 参考 将网络字节序的IP地址和字符串表示的点分十进制IP地址相互转换
#include <iostream>
#include <stdlib.h>
#include <arpa/inet.h>

int main()
{
    char IP[] = "127.0.0.1";
    in_addr address;
    int number = inet_aton(IP, &address);
    std::cout << number << std::endl;
    std::cout << address.s_addr << std::endl;
    std::cout << inet_ntoa(address) << std::endl;

    return 0;
}
输出
1
16777343
127.0.0.1

time(0) 返回系统时间(从1970.1.1开始算起,since epoch),单位:秒 参考

  • inet_addr:将点分十进制的字符串转换为网络字节序
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <arpa/inet.h>

using namespace std;

int main(){
    int val;
    char str[] = {"127.1.0.1"};
    val = inet_addr(str);
    printf("val: %d\n", val);
    
    return 0;
}
  • netstat -an | grep tcp 查看当前网络的TCP连接

  • netstat -lnp 查看网络连接(推荐)

  • tcpdump tcp -i any port 32323 -A -s 512 -nn 抓包分析

  • strcmp : 字符串比较

  • strstr:查找字符串第一次出现的位置;strcasestr:查找字符串第一次出现的位置,无视大小写

  • memset:字符串复制函数

  • strtol:将字符串根据给定的进制转换成long int型

  • memmove(str1, str2, n):从str2中复制n个字符到str1

  • sprintf(str1, st2):发送格式化输出str2到str1

  • fread() :读取文件流

  • rm core* 删除所有带core的文件

  • core文件参考 程序执行期间发生了segment fault段错误,操作系统会把此程序当前的内存信息dump到磁盘上,即生成core文件,可以使用gdb对core文件进行分析出程序crash的地方。core文件表明程序出现了严重的错误,需要详细的debug

  • Fiddler,参考 一个http的调试代理,以代理服务器的方式监听系统的http网络数据流动。

  • g++编译参数 参考 参考2

  • .a和.so 静态库与动态库:参考

  • makefile 中隐式规则 参考 CXX=g++

  • assert : 断言,用于调试程序和检查错误;一般用于检验参数的合法性,但是频繁的调用assert会极大影响程序的性能,增加额外的开销

  • strtok:与要搜索的字符串的顺序无关

    #include <stdlib.h>
    using namespace std;
    
    int main(){
        char method[100];
        char filename[100];
        char buffer[] = "GET /index.html HTTP/1.1\r\n";
    
        strcpy(method, strtok(buffer, " /"));
        strcpy(filename, strtok(NULL, "/ "));
        //strcpy(filename, strtok(NULL, " /"));
        printf("%s, %s\n", method, filename);
        
        return 0;
    }
    
  • 主机字节序与网络字节序:参考

    htonl, htons, ntohl, ntohs h表示主机,n表示网络,l表示整形long,s表示短整型short

    #include <stdlib.h>
    #include <arpa/inet.h>
    
    using namespace std;
    
    int main(){
        unsigned long a = 0x12345678;
        unsigned char *p = (unsigned char*)(&a);
        printf("主机字节序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]);
        printf("主机字节序数字大小: %d\n", a);
    
        unsigned long b = htonl(a);
        printf("网络字节序数字大小: %d\n", b);
        p = (unsigned char*)(&b);
        printf("网络字节序:%0x, %0x, %0x, %0x\n", p[0], p[1], p[2], p[3]);
        
        return 0;
    }
    
  • IP地址与网络字节序 参考

    #include <netinet/in.h>
    
    using namespace std;
    
    int main(){
        struct in_addr ipaddr;
        unsigned int addr = inet_addr("127.0.0.1");
        printf("addr = %d\n", ntohl(addr));
    
        ipaddr.s_addr = addr;     //addr为网络字节序
        printf("%s\n", inet_ntoa(ipaddr));
        return 0;
    }
    
  • 栈内存和堆内存参考 new出来的对象存储在堆内存中,直接定义的数组存储在栈内存中;栈内存很小,32M,但是速度快;当需要大的buffer时,要new出来,而不是直接char *;不然会报segment fault段错误

  • fread的r和rb模式:对于普通文本使用r,图片使用rb;使用r会遗漏某些控制的字符

  • .gitignore忽略文件:参考

  • coderunner使用C++11标准 参考

posted @ 2020-07-20 22:03  happy_fan  阅读(181)  评论(0编辑  收藏  举报