linux 下网络编程基础

一.     网络函数的总述

         在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); 
} 

  
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值