一、 C/C++语言基础
1. printf和sprintf的区别
printf是将参数打印到屏幕上,而sprintf是将参数输出到指针指向的数组里。 举例:
char* s = "hello word";
char buffer[100];
//参数只能是char*,不能是string
printf(s);
printf("\n");
//参数buffer在前
sprintf_s(buffer,s);
printf(buffer);
2. strcpy和strncpy的区别?
两个函数都是字符数组的拷贝函数,但是strncpy多一个参数n用来指定拷贝的长度。
- strcpy函数:原型:char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间,返回dest(地址中存储的为复制后的新值)。
要求:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 这里有两点需要注意的,首先原串得有结尾符NULL,不然strcpy无法停止,因为停止复制的条件是直到遇到结尾符。另外还要求目的串的内存空间足够大,如果太小的话,原串不能全部复制到目的串,会导致目的串没有结尾符NULL,当读取目的串的时候就会内存溢出。
一般函数原型实现方式:
char * strcpy(char * strDest,const char * strSrc)
{
char * strDestCopy=strDest; //[3]
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
- strncpy函数:多个参数n用来指定拷贝的长度。相比于strcpy拷贝到字符串的结尾符才停止,strncpy可以指定拷贝的字符数。
原型:char * strncpy(char *dest, char *src, size_t n);
功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。
要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。
和strcpy类似,strncpy拷贝的过程也需要考虑结尾的结束符。不过相比于strcpy,strcpy可以更好地控制复制的长度。常用的做法是先把目的串全部存上0,然后n设置小于目的串的空间,这样就能避免溢出和无结尾符的问题。但是这么做会存在原串只有一部分被拷贝。
3.extern "C"的作用
主要用与在C++代码中调用的C函数的声明,或C++中编译的函数要在C中调用。
为什么在C和C++之间互相调用函数需要extern "C"?
因为C编译器和C++编译器编译会生成不同的函数修饰名。C/C++程序中的函数在内部是通过修饰名来标识的。修饰名是在函数定义或原型编译阶段由编译器创建字符串。当你在LINK等工具中要指定一个函数名时,会用到修饰名。因此用C++编译的文件去调用C编译的函数时,由于同一个函数按照不同的规则生成了修饰名,导致连接器无法正常连接。举例如下:
void Test(void);
C++编译器可能实际把它改名为vTest_v,C++的重载/namespace等机制就是这样来的。而
extern "C" void Test(void);
则和C编译器一样为_Test。
二、 操作系统基础
三、计算机网络
1.输入URL到显示网页的过程
- 输入网址
- DNS解析
- 建立tcp连接
- 客户端发送HTPP请求
- 服务器处理请求
- 服务器响应请求
- 浏览器展示HTML
- 浏览器发送请求获取其他在HTML中的资源。
2. TCP/IP模型
(1)物理层
物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性,确保原始的数据可在各种物理媒体上传输,为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。
(2)数据链路层
主要提供链路控制(同步,异步,二进制,HDLC),差错控制(重发机制),流量控制(窗口机制)
-
MAC:媒体接入控制,主要功能是调度,把逻辑信道映射到传输信道,负责根据逻辑信道的瞬时源速率为各个传输信道选择适当的传输格式。MAC层主要有3类逻辑实体,第一类是MAC-b,负责处理广播信道数据;第二类是MAC-c,负责处理公共信道数据;第三类是MAC-d,负责处理专用信道数据。
-
RLC:无线链路控制,不仅能载控制面的数据,而且也承载用户面的数据。RLC子层有三种工作模式,分别是透明模式、非确认模式和确认模式,针对不同的业务采用不同的模式。
-
BMC:广播/组播控制,负责控制多播/组播业务。
-
PDCP:分组数据汇聚协议,负责对IP包的报头进行压缩和解压缩,以提高空中接口无线资源的利用率。
(3)网络层
提供阻塞控制,路由选择(静态路由,动态路由)等
-
IP:IP协议提供不可靠、无连接的传送服务。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。IP地址是重要概念
-
ARP:地址解析协议。基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据32位的IP地址。内核必须知道目的端的硬件地址才能发送数据。P2P的连接是不需要ARP的。
-
RARP:反向地址转换协议。允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。局域网网关路由器中存有一个表以映射MAC和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器。
-
IGMP:组播协议包括组成员管理协议和组播路由协议。组成员管理协议用于管理组播组成员的加入和离开,组播路由协议负责在路由器之间交互信息来建立组播树。IGMP属于前者,是组播路由器用来维护组播组成员信息的协议,运行于主机和和组播路由器之间。IGMP 信息封装在IP报文中,其IP的协议号为2。
-
ICMP:Internet控制报文协议。用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
-
BGP :边界网关协议。处理像因特网大小的网络和不相关路由域间的多路连接。
-
RIP:路由信息协议。是一种分布式的基于距离矢量的路由选择协议。
(4)传输层
提供分割与重组数据,按端口号寻址,连接管理差错控制和流量控制,纠错的功能。传输层要向会话层提供通信服务的可靠性,避免报文的出错、丢失、延迟时间紊乱、重复、乱序等差错。
-
TCP: 一种面向连接的、可靠的、基于字节流的传输层通信协议。
-
UDP: 用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
-
RTP: 实时传输协议,为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。
-
SCTP: 一个面向连接的流控制传输协议,它可以在两个端点之间提供稳定、有序的数据传递服务。SCTP可以看做是TCP协议的改进,它继承了TCP较为完善的拥塞控制并改进TCP的一些不足:
a. SCTP是多宿主连接,而TCP是单地址连接。
b.一个TCP连接只能支持一个流,一个SCTP连接可以支持多个流。
c.SCTP有更好的安全性。
(5)应用层
-
HTTP:超文本传输协议,基于TCP,是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。
-
SMTP:简单邮件传输协议,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
-
SNMP:简单网络管理协议,由一组网络管理的标准组成,包含一个应用层协议、数据库模型和一组资源对象。
-
FTP:文件传输协议,用于Internet上的控制文件的双向传输。同时也是一个应用程序。
-
Telnet:是Internet远程登陆服务的标准协议和主要方式。为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。
-
SSH:安全外壳协议,为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
-
NFS:网络文件系统,是FreeBSD支持的文件系统中的一种,允许网络中的计算机之间通过TCP/IP网络共享资源。