一. 网络函数的总述
在linux平台下,我们通过socket,bind,listen,connect,accept,send,recv函数利用tcp协议,使得用户与服务器之间建立可靠的长连接来进行交互,也可以通过socket,bind,sendto,recvfrom函数利用udp协议,使得两个ip进程进行交互,那今天就让我们来了解了解这些函数的实现,更深刻的明白这个交互是如何实现的,各个函数又起到了什么作用。
先让我们来看看这些系统调用是如何进入到内核的,如下图所示,
它们每个函数都对应了一个sys开头的内核函数,系统调用函数通过syscall宏,找到对应的内核统一接口函数所对应的系统调用号放到eax寄存器中,通过system_call,汇编代码将用户态参数拷贝到内核栈进行现场保护,通过80中断陷入内核,通过系统调用表找到sys_socketcall函数,通过参数call调用对应的sys函数,该函数做完相应工作,通过现场还原,回到用户空间。
具体的系统调用过程参照fork系统调用时的过程。
二. 具体的各个函数的源码分析请看具体的源码分析篇。
三. 大端与小端
1. 大端:是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中。即地址由小向大增加,而数据从高位往低位放;
2. 小端:是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。高地址部分权值高,低地址部分权值低。
3. 为什么会有大小端:
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
大小端在内存中的存储方式如下图所示:
4. 相互转换函数
PC端为通常为小端字节序,又被称为主机字节序。网络中通常使用大端字节序,又被称为网络字节序。
h代表host,n代表 network,s代表short,l代表long 。htonl()函数的意义是将本机器上的long数据转化为网络上的long。
5. 判断大小端的代码实现
#include
//返回true为小端,返回false为大端。
bool islittle_endian()
{
union
{
unsigned int a;
unsigned char b;
}c;
c.a = 1;
return (c.b == 1);
}