【C++】C++ 实现ping功能

目的

使用C++实现ping功能,用于在进行TCP/IP通讯前测试是否能与目标主机通讯。

原理

ping 命令是基于ICMP 协议来工作的,「ICMP」全称为Internet 控制报文协议( Internet Control Message Protocol)。基于ICMP协议向目标IP发送ICMP响应请求报文,目标主机收到这个报文之后,会向源IP回复一个ICMP响应应答报文。

C++实现

构建ICMPPing类实现上述功能。

  • icmp_ping.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef ICMPPING_H
#define ICMPPING_H

#include <Winsock2.h>
#include <iphlpapi.h>

#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"Ws2_32.lib")

class ICMPPing
{
private:
typedef HANDLE(WINAPI* ICMPCREATEFILE)(VOID);
typedef BOOL(WINAPI* ICMPCLOSEHANDLE)(HANDLE);
typedef DWORD(WINAPI* ICMPSENDECHO)(HANDLE, DWORD, LPVOID, WORD, PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);
private:
ICMPPing();
public:
~ICMPPing();
static ICMPPing* GetInstance();
// init ICMP function, return true for success, or for error
BOOL Init();
// ping host, return true for connect success, or for timeout
BOOL Ping(const char* host);
private:
static ICMPPing* icmp_ping_;
// pointer of function
ICMPCREATEFILE pIcmpCreateFile_;
ICMPCLOSEHANDLE pIcmpCloseHandle_;
ICMPSENDECHO pIcmpSendEcho_;
};

#endif
阅读全文

【Java】Java 基础语法

Java 概述

谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。

我们日常会接触到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。

  • JRE,也就是 Java 运行环境,包含了 JVMJava 类库,以及一些模块等。
  • JDK 可以看作是 JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。

对于“Java 是解释执行”这句话,这个说法不太准确。我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码(.class 文件)。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。

严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机和DOS类似,相当于一个供程序运行的平台。

程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成 .class 文件字节码,这是第一次编译。.class 文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。

“到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。需要强调的一点是,Java并不是编译机制,而是解释机制。Java字节码的设计充分考虑了JIT这一即时编译方式,可以将字节码直接转化成高性能的本地机器码,这同样是虚拟机的一个构成部分。

阅读全文