-
GDB单步调节程序
所属栏目:[语言] 日期:2022-07-12 热度:164
《调用GDB调试器的几种方式》一节中提到,借助 next 命令可以控制 GDB 单步执行程序。所谓单步调试,就是通过一行一行的执行程序,观察整个程序的执行流程,进而尝试发现一些存在的异常或者 Bug。 根据实际场景的需要,GDB 调试器共提供了 3 种可实现单步调[详细]
-
GDB print和display命令 查视变量的值
所属栏目:[语言] 日期:2022-07-12 热度:181
前面章节中提到,使用 GDB 调试程序,最常用的方法是:单步调试或者断点调试程序,期间通过查看某个变量或者表达式的值,判断当前程序的执行过程是否正确,不断缩小异常或 Bug 位于代码中的范围,最终找到并修复。 对于在调试期间查看某个变量或表达式的值,[详细]
-
GDB禁用与删除断点
所属栏目:[语言] 日期:2022-07-12 热度:168
我们知道,GDB 调试器支持 3 种断点,分别为普通断点(用 break 命令创建)、观察断点(用 watch 命令建立)以及捕捉断点(用 catch 命令建立)。并且如果需要的话,我们可以在被调试程序中打多个断点,甚至于 GDB 允许在同一位置打多个断点。 这就产生一个[详细]
-
GDB handle命令 信号处置
所属栏目:[语言] 日期:2022-07-12 热度:54
C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子: #include stdio.h #include unistd.h #include signal.h void display(){ printf(http://c.biancheng.net/gdb/); } int main () { pid_t cpid; pid_t ppid; signal(SIGINT,display); if((c[详细]
-
GDB frame和backtrace命令 检查栈信息
所属栏目:[语言] 日期:2022-07-12 热度:187
当程序因某种异常停止运行时,我们要做的就是找到程序停止的具体位置,分析导致程序停止的原因。 对于 C、C++ 程序而言,异常往往出现在某个函数体内,例如 main() 主函数、调用的系统库函数或者自定义的函数等。要知道,程序中每个被调用的函数在执行时,都[详细]
-
GDB编辑及搜索源码
所属栏目:[语言] 日期:2022-07-12 热度:164
本节主要讲解的是在 GDB 内对源文件中的代码进行修改和查找,分别对应 GDB 中的 edit 命令和 search 命令,下面是对这两个命令的详细介绍。 GDB edit命令:编辑文件 在 GDB 中编辑源文件中使用 edit 命令,该命令的语法格式如下: (gdb) edit [location] (gd[详细]
-
GDB help命令 查看目标命令的详细用法
所属栏目:[语言] 日期:2022-07-12 热度:177
截止到本节,我们接触了大量的 GDB 命令,甚至很多命令还拥有不同的语法格式和参数。这就产生一个问题,如何才能记住它们呢? 实际上,GDB 调试器的开发人员也想到了这个问题。为了降低用户使用 GDB 调试器的学习成本,GDB 提供了 help 命令,它可以帮用户打[详细]
-
bind 和connect 函数 绑定套接字并创立连接
所属栏目:[语言] 日期:2022-07-11 热度:153
socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理。类似地,客户端也要用 connect() 函数建立连接。 下面的代码,将创建[详细]
-
listen和accept函数 使套接字进入监听状态并响应客户端请求
所属栏目:[语言] 日期:2022-07-11 热度:145
对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。 listen() 函数 通过 listen() 函数可以让套接字进入被动监听状态,它的原型为: int listen(int so[详细]
-
send recv 和write read 发送数据与接收数据
所属栏目:[语言] 日期:2022-07-11 热度:108
在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。 前面我们说过,两台计算[详细]
-
socket缓冲区以及阻塞模式说明
所属栏目:[语言] 日期:2022-07-11 热度:153
在《socket数据的接收和发送》一节中讲到,可以使用 write()/send() 函数发送数据,使用 read()/recv() 函数接收数据,本节就来看看数据是如何传递的。 socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。 write()/send() 并[详细]
-
TCP协议的粘包难题 数据的无边界性
所属栏目:[语言] 日期:2022-07-11 热度:61
上节我们讲到了socket缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不同。 例如,write()/send() 重复执行三次[详细]
-
图解TCP数据报结构以及三次握手 很详细
所属栏目:[语言] 日期:2022-07-11 热度:77
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。 客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、[详细]
-
详细分析TCP数据的传输步骤
所属栏目:[语言] 日期:2022-07-11 热度:117
此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数。假设每次 Ack 号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全部正确传递还是丢失了一部分,比如只传递了80字节。因此按如下的公式确认 Ack 号: Ack号[详细]
-
解析TCP四次握手断开连接
所属栏目:[语言] 日期:2022-07-11 热度:78
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。 建立连接后,客户端和服务器都处于ES[详细]
-
再聊聊UDP和TCP
所属栏目:[语言] 日期:2022-07-11 热度:82
TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。 UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到[详细]
-
介于UDP的服务器端和客户端
所属栏目:[语言] 日期:2022-07-11 热度:119
前面的文章中我们给出了几个 TCP 的例子,对于 UDP 而言,只要能理解前面的内容,实现并非难事。 UDP中的服务器端和客户端没有连接 UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen[详细]
-
Java抽象 abstract 类
所属栏目:[语言] 日期:2022-07-10 热度:198
Java 语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具体类。这一节介绍一下抽象类。 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的[详细]
-
Java接口 Interface 的定义和实现
所属栏目:[语言] 日期:2022-07-10 热度:67
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的抽象类接口(Interface)。接口是 Java 中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成。[详细]
-
Java内部类是什么
所属栏目:[语言] 日期:2022-07-10 热度:179
在类内部可定义成员变量和方法,且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。 内部类可以很好地实现隐藏,一般的非内部类是不允许有 pr[详细]
-
Java实例内部类
所属栏目:[语言] 日期:2022-07-10 热度:187
实例内部类是指没有用 static 修饰的内部类,有的地方也称为非静态内部类。示例代码如下: public class Outer { class Inner { // 实例内部类 } } 上述示例中的 Inner 类就是实例内部类。实例内部类有如下特点。 1)在外部类的静态方法和外部类以外的其他类[详细]
-
Java静态内部类
所属栏目:[语言] 日期:2022-07-10 热度:163
静态内部类是指使用 static 修饰的内部类。示例代码如下: public class Outer { static class Inner { // 静态内部类 } } 上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点。 1)在创建静态内部类的实例时,不需要创建外部类的实例。 public cla[详细]
-
Java局部内部类
所属栏目:[语言] 日期:2022-07-10 热度:103
局部内部类是指在一个方法中定义的内部类。示例代码如下: public class Test { public void method() { class Inner { // 局部内部类 } } } 局部内部类有如下特点: 1)局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)[详细]
-
Java匿名类 Java匿名内部类
所属栏目:[语言] 日期:2022-07-10 热度:199
匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: new 类或接口() { // 类的主体 }; 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块[详细]
-
Java8新特性 Effectively final
所属栏目:[语言] 日期:2022-07-10 热度:147
Java 中局部内部类和匿名内部类访问的局部变量必须由 final 修饰,以保证内部类和外部类的数据一致性。但从 Java 8 开始,我们可以不加 final 修饰符,由系统默认添加,当然这在 Java 8 以前的版本是不允许的。Java 将这个功能称为 Effectively final 功能。[详细]
