自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 C++学习笔记(55)

应用程序调用 recv()/read()函数接收数据的。1)主动断开的端在四次挥手后,socket 的状态为 TIME_WAIT,该状态将持续 2MSL(30 秒/1 分。服务端调用 listen()函数后进入监听(等待连接)状态,这时候,客户端就可以调用 connect()函数。块会被马上发送到接收端,接着,发送端又调用 send()函数写入一个 int 型数据(称之为 B 数据块),1)客户端的 socket 也有端口号,对程序员来说,不必关心客户端 socket 的端口号,所以系统随机。

2024-10-10 09:57:16 353

原创 C++学习笔记(54)

cout << "文件信息结构体" << fileinfo.filename << "(" << fileinfo.filesize <<")。cout << "发送文件信息的结构体" << fileinfo.filename << "(" << fileinfo.filesize <<")。if ((h=gethostbyname(m_ip.c_str()))==nullptr ) // 把域名/主机名/字符串格式的 IP转换成结。

2024-10-10 09:56:39 176

原创 C++学习笔记(53)

if (tcpserver.initserver(atoi(argv[1]))==false) // 初始化服务端用于监听的 socket。cout << "子进程" << getpid() << "退出,sig=" << sig << endl;cout << "客户端已连接(" << tcpserver.clientip() << ")。if (tcpserver.send(buffer)==false) // 向对端发送报文。

2024-10-09 20:27:05 251

原创 C++学习笔记(52)

if ((h=gethostbyname(m_ip.c_str()))==nullptr ) // 把域名/主机名/字符串格式的 IP转换成结。if (tcpserver.initserver(atoi(argv[1]))==false) // 初始化服务端用于监听的 socket。if (tcpclient.connect(argv[1],atoi(argv[2]))==false) // 向服务端发起连接请求。

2024-10-09 20:26:27 228

原创 C++学习笔记(51)

define h_addr h_addr_list[0] // for backward compatibility. 转换后,用以下代码把大端序的地址复制到 sockaddr_in 结构体的 sin_addr 成员中。

2024-10-08 09:24:24 612

原创 C++学习笔记(50)

操作文件的本质是把内存中的数据写入磁盘,在网络编程中,传输数据的本质也是把数据写入文件。 小端序(Little Endia):低位字节存放在低位,高位字节存放在高位。 大端序(Big Endian):低位字节存放在高位,高位字节存放在低位。为了解决不同字节序的计算机之间传输数据的问题,约定采用网络字节序(大端序)。这样的话,字节序不同的计算机之间传输数据,可能会出现问题。s short(2 字节,16 位的整数);l long(4 字节,32 位的整数);343、主机字节序与网络字节序。

2024-10-08 09:23:37 379

原创 C++学习笔记(49)

2)数据的顺序不会错乱;2)数据的顺序可能会错乱;a)UDP 是无连接的,即发送数据之前不需要建立连接,这种方式为 UDP 带来了高效的传输效率,a)数据分片:在发送端对用户数据进行分片,在接收端进行重组,由 TCP 确定分片的大小并控制分。这是个伪命题,如果用 UDP 实现可靠传输,那么,应用程序必须实现重传和排序等功能,非常麻烦,b)TCP 是可靠的通信方式,通过超时重传、数据校验等方式来确保数据无差错,不丢失,不重复,f)重复处理:如果传输的分片出现重复,TCP 的接收端会丢弃重复的数据;

2024-09-28 23:44:04 439

原创 C++学习笔记(48)

if (write(fd,buffer,strlen(buffer))==-1) // 把数据写入文件。if (read(fd,buffer,sizeof(buffer))==-1) // 从文件中读取数据。// demo3.cpp,本程序演示了 Linux 底层文件的操作-创建文件并写入数据。// demo4.cpp,本程序演示了 Linux 底层文件的操作-读取文件。printf("文件描述符 fd=%d\n",fd);// 定义一个文件描述符/文件句柄。// 定义一个文件描述符/文件句柄。

2024-09-28 23:43:22 427

原创 c++学习笔记(47)

if ( (h = gethostbyname(argv[1])) == 0 ) // 把字符串格式的 IP 转换成结构体。// 信号量的 P 操作(把信号量的值减 value),如果信号量的值是 0,将阻塞等待,直到信号量的值。// 用于存放服务端 IP 和端口的结构体。

2024-09-27 22:36:59 1148

原创 C++学习笔记(46)

/ 信号量的 P 操作,如果信号量的值是 0,将阻塞等待,直到信号量。// 信号量的值用于表示队列中数据元素的个数。while (QQ->empty()) // 如果队列空,进入循环,否则直接处理数据。// 获取信号量的值,成功返回信号量的值,失败返回-1。

2024-09-27 22:36:12 497

原创 C++学习笔记(45)

cout << "原值:no=" << ptr->no << ",name=" << ptr->name << endl;cout << "新值:no=" << ptr->no << ",name=" << ptr->name << endl;cout << "队列的长度是" << QQ->size() << endl;cout << "队列的长度是" << QQ->size() << endl;cout << "队列的长度是" << QQ->size() << endl;

2024-09-26 21:47:18 598

原创 C++学习笔记(44)

cout << "原值:no=" << ptr->no << ",name=" << ptr->name << endl;cout << "新值:no=" << ptr->no << ",name=" << ptr->name << endl;用 ipcs -m 可以查看系统的共享内存,包括:键值(key),共享内存 id(shmid),拥有者(own。进程可以将共享内存连接到它们自己的地址空间中,如果。在多进程中,每个进程的地址空间是独立的,不共享的,如果多个进程需要访问同一块内存,不能用。

2024-09-26 21:46:35 350

原创 C++学习笔记(43)

if (WIFEXITED(sts)) { cout << "子进程是正常退出的,退出状态是:" << WEXITSTATUS(sts) <<fout << "进程" << getpid() << "西施" << ii << "极漂亮" << "\n";else { cout << "子进程是异常退出的,终止它的信号是:" << WTERMSIG(sts) << endl;cout << "子进程" << getpid() << "退出,sig=" << sig << endl;

2024-09-25 21:07:30 403

原创 c++学习笔记(42)

子进是父进程的副本,父进程和子进程都从调用 fork()之后的。见,父进程等待客户端的连接请求,当请求到达时,父进程调用 fork(),让子进程处理些请求,而父进程。cout << "父:亲爱的" << bh << "号:" << message << endl;cout << "子:亲爱的" << bh << "号:" << message << endl;子进程获得了父进程数据空间、堆和栈的副本(注意:子进程拥有的是副本,不是和父进程共享)。1)父进程复制自己,然后,父进程和子进程分别执行不同的代码。

2024-09-25 21:06:43 369

原创 C++学习笔记(41)

正常终止进程的 3 个函数(exit()和_Exit()是由 ISO C 说明的,_exit()是由 POSIX 说明的)。在 main()函数中,return 的返回值即终止状态,如果没有 return 语句或调用 exit(),那么该进程的。exit()会执行清理工作,然后退出,_exit()和_Exit()直接退出,不会执行任何清理工作。如果向服务程序发送一个信号,服务程序收到信号后,调用一个函数,在函数中编写善后的代码,程。返回值:0-成功,-1-失败,errno 被设置。

2024-09-24 08:19:26 670

原创 C++学习笔记(40)

cout << argv[1] << "是一个文件(" << "mtime=" << st.st_mtime << ",size=" << st.st_size。cout << argv[1] << "是一个目录(" << "mtime=" << st.st_mtime << ",size=" << st.st_size。perror() 在<stdio.h>中声明,用于在控制台显示最近一次系统错误的详细信息,在实际开发中,服。// 最近一次被更改的时间,在文件所有者、组、 权限被更改时更新。

2024-09-24 08:18:14 1183

原创 C++学习笔记(39)

cout << "文件名=" << stdinfo->d_name << ",文件类型=" << (int)stdinfo->d_type <<time_t now;cout << "耗时:" << tv.tv_sec << "秒和" << tv.tv_usec << "微秒。mktime()函数的功能与 localtime()函数相反,用于把 tm 结构体时间转换为 time_t 时间。time_t 是一个长整数,不符合人类的使用习惯,需要转换成 tm 结构体,tm 结构体在<time.h>中声。

2024-09-23 09:58:26 958

原创 C++学习笔记(38)

continue c 继续运行程序,遇到下一个断点停止,如果没有遇到断点,程序将一直运行。如果程序在运行的过程中发生了内存泄漏,会被内核强行终止,提示“段错误(吐核)”,内存的状。run r 开始运行程序, 程序运行到断点的位置会停下来,如果没有遇到断点,程序一直。print p 显示变量或表达式的值,如果 p 后面是表达式,会执行这个表达式。如果希望程序可调试,编译时需要加-g 选项,并且,不能使用-O 的优化选项。注意了,如果函数是库函数或第三方提供的函数,用 s 也是进不去的,因为没有。

2024-09-23 09:57:36 880

原创 C++学习笔记(37)

overwrite 0-如果环境不存在,增加新的环境变量,如果环境变量已存在,不替换其值;cout << "第" << ii << "个参数:" << argv[ii] << endl;cout << argv[1] << "开始向" << argv[2] << "表白。在实际开发中,项目的源代码文件比较多,按类型、功能、模块分别存放在不同的目录和文件中,哪。些文件需要先编译,那些文件后编译,那些文件需要重新编译,还有更多更复杂的操作。在程序中,如果不关心 main()函数的参数,可以省略不写。

2024-09-22 13:41:01 607

原创 C++学习笔记(36)

 程序的更新和发布不方便,如果某一个静态库更新了,所有使用它的程序都需要重新编译。-O 或-O1: 对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间。在实际开发中,我们把通用的函数和类分文件编写,称之为库。如果多个进程中用到了同一动态库中的函数或类,那么在内存中只有一份,避免了空间浪费问题。一般来说,通用的函数和类不提供源代码文件(安全性、商业机密),而是编译成二进制文件。

2024-09-22 13:40:28 607

原创 C++学习笔记(35)

// 判断链表是否存在。} // 判断链表是否存在。

2024-09-20 20:35:31 731

原创 C++学习笔记(34)

三十六、队列示例:#include <iostream>using namespace std;typedef int ElemType; // 自定义队列的数据元素为整数。struct LNode{ElemType data; // 存储队列中的元素。struct LNode* next; // next 指针。};struct LinkQueue{LNode* head,*tail; // 队列的头指针和尾指针。};// 初始化队列。bool InitQueue(LinkQ

2024-09-20 20:34:28 504

原创 C++学习笔记(33)

if (head->next == nullptr) { cout << "链栈为空,没有结点。if (head == nullptr) { cout << "链栈不存在。if (head == nullptr) { cout << "链栈不存在。if (head == nullptr) { cout << "链栈不存在。if (head == nullptr) { cout << "链栈不存在。// 分配一个新结点。cout << "链栈的长度:" << StackLength(SS) << endl;

2024-09-19 18:47:43 343

原创 C++学习笔记(32)

if (pp == nullptr) { cout << "位置" << n << "不合法,超过了表长。} // 判断链表是否存在。cout << "元素为 4 的结点的地址是:" << p1 << ",值是:" << p1->data << endl;cout << "位序为 3 的结点的地址是:" << p2 << ",值是:" << p2->data << endl;//if (head == nullptr) { cout << "链表不存在。

2024-09-19 18:47:07 842

原创 C++学习笔记(31)

cout << "插入位置" << pos << "不合法,应该在 1-" << LL.length + 1 << "之间。cout << "删除位置" << pos << "不合法,应该在 1-" << LL.length << "之间。cout << "元素为 4 的结点的地址是:" << p1 << ",值是:" << p1->data << endl;cout << "位序为 3 的结点的地址是:" << p2 << ",值是:" << p2->data << endl;

2024-09-18 23:29:49 507

原创 C++学习笔记(30)

cout << "插入位置" << pos << "不合法,应该在 1-" << LL.length + 1 << "之间。cout << "插入位置" << pos << "不合法,应该在 1-" << LL.length + 1 << "之间。cout << "删除位置" << pos << "不合法,应该在 1-" << LL.length << "之间。cout << "删除位置" << pos << "不合法,应该在 1-" << LL.length << "之间。

2024-09-18 23:28:57 466

原创 C++学习笔记(29)

3</bh><name>西施</name><sex>女</sex><age>18</age><yz>漂亮</yz>// <bh>3</bh><name>西施</name><sex>女</sex><age>18</age><yz>漂亮</yz>// <bh>3</bh><name>西施</name><sex>女</sex><age>18</age><yz>漂亮</yz><bh>3西施女18漂亮

2024-09-17 14:41:28 817

原创 C++学习笔记(28)

while ( (ii < len) && (jj < slen) ) // 如果 ii==len,表示目标串已结束;// 目标串和子串的长度。// 两个字符串相等。// 如果能确定拷贝内存没有重叠,memcpy()比 memmove()更高效,如果有重叠,只能 memmove()。// 如果能确定拷贝内存没有重叠,memcpy()比 memmove()更高效,如果有重叠,只能 memmove()。if (str[ii] == substr[jj]) { // 如果目标串和子串数组下标指向的字符是相等的。

2024-09-17 14:40:48 692

原创 C++学习笔记(27)

十一、把字符串转换成整数有两个任务:1)为了支持把 C 风格的字符串转换成数字,C++提供了以下四个函数:int atoi(const char *_String); // 把 C 风格字符串转换为 int 整数。long atol(const char *_String); // 把 C 风格字符串转换为 long 整数。long long atoll(const char *_String); // 把 C 风格字符串转换为 long long 整数。double atof(const ch

2024-09-16 12:07:26 930

原创 C++学习笔记(26)

cout << "请输入第" << ii + 1 << "组,第" << jj + 1 << "名超女的体重:";cout << "第" << ii + 1 << "组超女的平均体重是:" << sum / 4 << endl;cout << "请输入第" << ii + 1 << "超女的姓名:";cout << "全总超女的平均体重是:" << total / 12 << endl;cout << "亲爱的 " << name[ii] << ",我是一只傻傻鸟。

2024-09-16 12:06:32 1065

原创 C++学习笔记(25)

/ 2)自定义一个函数,把字符的'0'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9' // 转换为整数的 0、1、2、3、4、5、6、7、8、9。// 若 ch 是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非 0,否则返回 0。2)自定义一个函数,把字符的'0'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'转换为整数的 0、1、2、// 若 ch 是字母('A'-'Z','a'-'z')返回非 0,否则返回 0。

2024-09-15 12:16:25 1042

原创 C++学习笔记(24)

else if (stgirl.age >= 18 && stgirl.age <= 30 && stgirl.height >= 160 && stgirl.height <= 165 && (strcmp(stgirl.sc, "火辣") == 0 || strcmp(stgirl.sc, "普通") == 0) && stgirl.yz) {ptr->callback(&HX::show, static_cast<HX*>(ptr));} // 调用子类的成员函数。// 调用子类的成员函数。

2024-09-15 12:15:37 947

原创 C++学习笔记(23)

/ 绑定成员函数。// 绑定类的静态成员函数。cout << "线程:" << this_thread::get_id() << "," << message << endl;cout << "亲爱的" << bh << "," << message << endl;

2024-09-14 10:29:11 592

原创 C++学习笔记(22)

/ 包装类的静态成员函数。

2024-09-14 10:28:27 478

原创 C++学习笔记(21)

cout << "线程:" << this_thread::get_id() << "," << message << endl;cout << "线程:" << this_thread::get_id() << "," << message << endl;// 读取原子变量 a 的值。

2024-09-13 20:07:02 580

原创 C++学习笔记(20)

cout << "第" << ii << "次表白:亲爱的" << bh << "号," << str << endl;如果互斥锁是锁定状态,调用 lock()成员函数的线程就会阻塞等待,直到互斥锁变成未锁定状态。如果互斥锁是未锁定状态,调用 lock()成员函数的线程会得到互斥锁的所有权,并将其上锁。thread t1(func, 1, "我是一只傻傻鸟。thread t2(func, 2, "我是一只傻傻鸟。

2024-09-13 20:06:14 407

原创 C++学习笔记(19)

cout << "第" << ii << "次表白:亲爱的" << bh << "号," << str << endl;cout << "第" << ii << "次表白:亲爱的" << bh << "号," << str << endl;cout << "第" << ii << "次表白:亲爱的" << bh << "号," << str << endl;// once_flag 全局变量。cout << "子线程:" << this_thread::get_id() << endl;

2024-09-12 13:06:58 554

原创 C++学习笔记(18)

cout << "耗时: " << dt.count() << "纳秒("<<(double)dt.count()/(1000*1000*1000)<<" 秒)";//cout << "还有" << sizeof...(args) << "个参数未展开。cout << "第" << ii << "次表白:亲爱的" << bh << "号," << str << endl;cout << "第" << ii << "次表白:亲爱的" << bh << "号," << str << endl;

2024-09-12 13:06:24 486

原创 C++学习笔记(17)

/ 编译出错,默认引用捕获,显式引用捕获,冲突了。// aa 是左值 ,getTemp()的返回值是右值(临时变量)。// 编译出错,默认值捕获,显式值捕获,冲突了。// 将使用派生类自己有三个参数的构造函数,调用 A(a,b)初始化 m_a 和 m_b,同时初始化 m_c。

2024-09-10 23:00:58 929

原创 C++学习笔记(16)

用 atoi()、atol()、atof()把 char *字符串转换为数值。1)C++11 新增了的方法 cbegin()、cend()、crbegin()、crend(),这些方法将元素视为 const。base:若 base 为 0,则自动检测数值进制:若前缀为 0,则为八进制,若前缀为 0x 或 0X,则为十。void test() // 错误,BB 类中的 test()后面有 final,不允许重写。在派生类中,把 override 放在成员函数的后面,表示重写基类的虚函数,提高代码的可读性。

2024-09-10 23:00:12 705

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除