网络编程

友情链接:Tcp的3次握手与4次分手
ICMP 协议: 电脑之间相互Ping时用的协议

以太网帧


ARP协议(解决目的物理地址的问题,链路层)

Pc1发一个ARP请求包,FFFFF为群发,
当PC2发现目的IP地址和自己相同时,接受,回一个应答包,应答包中含有自己的物理地址,也不是每次同信都要先发送一个ARP请求包,每个主机都有一个ARP映射表。
图中交换机工作在链路层,并没有涉及IP,只是获取解析出物理地址

抓包工具
WireShark

IP协议(网络层,不可靠协议)
TCP协议(传输层,连接的,可靠的 流协议)
UDP(传输层,无连接的,不可靠的,数据包协议)

ping的时候是发了个ICMP的数据包,属于网络层(ICMP、IGMP、IP、)
ICMP(判断2台主机是否同信)

路由器主要是解析计算IP地址,下一跳是哪一步,提供路由算法,工作在网络层,

交换机,负责以太网帧的目的地址来决定以太网帧发给谁,(工作在链路层)。

大端字节序:高字节在底地址,低字节在高地址
小端字节序:高字节在高地址,底字节在底地址 x86
判断大端序还是小端序

0

C++mulThread

线程与进程之间的关系
线程的创建
线程传参
线程间通信
线程数据竞争
线程死锁
lock_guard()—RAII—解决线程挂掉后没有解锁的情况
unique_lock能够使用move

以下3种对象都可以传进线程
– A function pointer
– A function object
– A lambda expression

// CPP program to demonstrate multithreading 
// using three different callables. 
#include <iostream> 
#include <thread> 
using namespace std; 

// A dummy function 
void foo(int Z) 
{ 
    for (int i = 0; i < Z; i++) { 
        cout << "Thread using function"
            " pointer as callable\n"; 
    } 
} 

// A callable object 
class thread_obj { 
public: 
    void operator()(int x) 
    { 
        for (int i = 0; i < x; i++) 
            cout << "Thread using function"
                " object as callable\n"; 
    } 
}; 

int main() 
{ 
    cout << "Threads 1 and 2 and 3 "
        "operating independently" << endl; 

    // This thread is launched by using 
    // function pointer as callable 
    thread th1(foo, 3); 

    // This thread is launched by using 
    // function object as callable 
    thread th2(thread_obj(), 3); 

    // Define a Lambda Expression 
    auto f = [](int x) { 
        for (int i = 0; i < x; i++) 
            cout << "Thread using lambda"
            " expression as callable\n"; 
    }; 

    // This thread is launched by using 
    // lamda expression as callable 
    thread th3(f, 3); 

    // Wait for the threads to finish 
    // Wait for thread t1 to finish 
    th1.join(); 

    // Wait for thread t2 to finish 
    th2.join(); 

    // Wait for thread t3 to finish 
    th3.join(); 

    return 0; 
} 

对于下面的将对象传入线程则会造成语法上的义:

class obj
{
public:
void operator()()
{
dosomething();
}
}
int main()
{
//std::thread my_thread(obj());//syntax errro;编译器会认为是你申明了一个带参(这个参数是一个无参的函数)的函数,这个函数返回一个std::thread的类型,而非会启动一个线程,为了解决这个语法歧义问题,可以用下面的方法
//std::thread my_thread((obj()));
或
//std::thread my_thread{obj()};
也可以传入lmada
std::thread my_thread(
[](){dosomething()};
)
}

防止死锁的方法之一:在二个线程中要以相同的次序获得硕

T20 C++ multithreading mistskes and how to avoid them

https://www.acodersjourney.com/top-20-cplusplus-multithreading-mistakes/

C++ Multithreading Tutorial via Q&A

https://www.acodersjourney.com/c11-multithreading-tutorial-via-faq-thread-management-basics/#q2

0

C++左值右值问题,与移动构造

右值引用解决高效,效率的问题


++x 与 x++, 假定x的定义为 int x=0;,那么前者是 lvalue,后者是rvalue。前者修改自身值,并返回自身;后者先创建一个临时对像,为其赋值,而后修改x的值,最后返回临时对像。优先使用前++

C++类初始化过程:先父类,再类对象,再本类


0