第五章 Linux网络编程基础api

  1、主机字节序和网络字节序

    字节序是指整数在内存中保存的顺序。字节序分为大端字节序、小端字节序。

    端字节序:一个整数的高位字节数据存放在内存的低地址处。低位字节存储在内存的高地址处。称为网络字节序

    端字节序:指整数的高位字节序存储在内存的高地址处。低位字节则存储在内存的低地址处。称为主机字节序

  

  现代的PC大多数采用小端字节序。当两台使用不同字节序的主机之间进行数据传递时,要判断对方发送过来的数据是否满足当前机器的字节序,如果不满足,则进行数据的转换流程,然后在进行数据储存。因为linux提供了一些函数方法进行格式化。已保证数据能够正常存储。四个函数如下:

  unsigned long int htonl  (从主机字节序转 换到 网络字节序)

  unsigned short int htons (从主机字节序转 换到 网络字节序)

  unsigned long int ntohl (从网络字节序 转到 主机字节序)

  unsigned short int ntohs (从网络字节序 转到 主机字节序)

  2、通用 socket 地址

    在socket网络编程接口中,表示 socket 地址的结构体是 sockaddr 。地址族和协议族的的关系如图:地址族(AF*)协议族(PF*)

  

  其实地址族和协议族都是一样的,值也一样,只是用来识别不同的协议。因为unix有两种风格系统,BSD系统和POSIX系统,对于BSD系统,一直用AF*协议,对于POSIX一直用PF*协议。所以Linux为了兼容两个风格都支持了。

  3、socket

    创建socket :  int socket ( int domain, int type, int protocol);

      说明:创建socket描述符,其实socket也就是一个特殊文件。linux所有东西都是文件。

      参数:

      domain:就是协议族,到时的TCP/IP协议还是UDP协议等。对于TCP/IP协议参数就如上图。

      type: 指定socket服务类型。主要有 SOCK_STREAM服务(流服务,tcp/ip协议会使用这个)SOCK_UGRAM(数据报服务,udp协议会使用这个)

      protocol: 指定协议,默认是0使用type指定的默认协议。

    命名socket:   int bind (int sockfd const struct sockaddr* my_addr, socklen_t addrlen);

      说明:创建socket后需要给他指定一个地址族,将一个socket与socket地址绑定成为socket命名。

      参数:

      sockfd: 就是创建就的socket,bind()就是将这个socket绑定一个名字

      addr:一个const struct sockaddr*指针,指向要绑定给sockfd的协议地址。

      addrlen:对应的是地址的长度。

      通常服务器在启动的时候会创建一个socket并且给他绑定一个地址(ip+端口号)用于提供服务,客户端就可以通过他来连接服务器。而客户端就不需要指定是哪一个地址。系统会在 客户端connect()的时候自动分配一个端口号+ip地址给他。这就是通常服务器在listen之前会bind()。

     接受连接:      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

      参数:

      sockfd:就是指被监听的socket

      addr:获取被接受连接的远端socket地址。

        addrlen: 对应的是地址的长度。

    监听socket:   int listen (int sockfd, int backlog);

      说明:socket被命名之后还不能马上接受客户连接。需要创建一个监听对垒存放待处理的客户连接。

      参数:

      sockfd:就是指被监听的socket

      backlog:就是监听队列的最大长度      

    发起连接:    int connect (int sockfd, const struct sockaddr * serv_addr, socklen_t addrlen);

           int read() int write() 进行读写

    关闭连接:    int close( int fd);

      当连接结束时,我们调用close将其关闭,但是close并不总是关闭连接,而是将这个文件描述符的引用计数减1,只有当这个文件描述符的引用计数为0时才会真正关闭。在多进程程序中,一次fork就会使得父进程中打开的文件描述符引用计数加1,所以这种情况下我们就应该对父子进程中的文件描述符都执行一次close。如果要立即终止连接,就可以使用下面的shutdown函数,参数howto的取值分别为SHUT_RD、SHUT_WR和SHUT_RDWR。

  

linux高性能服务器编程 (五) --Linux网络编程基础api的更多相关文章

  1. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...

  2. linux高性能服务器编程

    <Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...

  3. Linux 高性能服务器编程——I/O复用

    问题聚焦:     前篇提到了I/O处理单元的四种I/O模型.     本篇详细介绍实现这些I/O模型所用到的相关技术.     核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...

  4. Linux 高性能服务器编程——高性能服务器程序框架

    问题聚焦:     核心章节.     服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...

  5. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  6. Linux 高性能服务器编程——IP协议详解

    1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的.     ...

  7. Linux 高性能服务器编程——TCP/IP协议族

    1 TCP/IP协议族体系结构 数据链路层:     职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网.令牌环等)上的传输.     常用协议:ARP协议(地址解析协议),RARP协议 ...

  8. Linux高性能服务器编程,书中的 shell 命令

    记录<Linux高性能服务器编程>书里面讲解到的若干 shell 命令 arp 命令查看ARP高速缓存: [root@VM_0_10_centos heliang]# arp -a ? ( ...

  9. linux高性能服务器编程 (一) --Tcp/Ip协议族

    前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...

  10. Linux 高性能服务器编程——多线程编程

    问题聚焦:     在简单地介绍线程的基本知识之后,主要讨论三个方面的内容:    1 创建线程和结束线程:    2 读取和设置线程属性:    3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...

随机推荐

  1. 为什么要用 redis 而不用 map 做缓存?

    缓存分为本地缓存和分布式缓存.以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例 ...

  2. Django--FBV + CBV

    目录 FBV + CBV FBV(function bases views) FBV中加装饰器相关 CBV(class bases views) CBV中加装饰器相关 FBV + CBV django ...

  3. 玩转zynq7020之风速风向测量实战项目

    本文是用米尔zynq7020开发板(Z-turn broad)风速风向测量实战项目. 这次项目是以测量风速风向为目标的产品,由于传统的风杯有很大的缺陷,在零下20度,结冰后不能使用,还有启动风速等等, ...

  4. 2.JavaScript中的原型规则以及原型设计模式

    原型规则 原型规则 所有的引用类型(数组.对象.函数),都具有对象特征,即可自由扩展属性: 所有的引用类型,都有一个_proto_ 属性(隐式原型),属性值是一个普通对象: 所有函数,都具有一个pro ...

  5. 使用DES算法实现加密解密

    使用DES算法实现加密解密 我们常见的加密算法有DES.MD5.IDEA.AES等等,这篇随笔介绍使用DES算法实现加密解密 首先介绍一下DES算法: DES算法为密码体制中的对称密码体制,又被称为美 ...

  6. 服务上的图片直接在浏览器上可以打开,但是在img上报404错误处理方法

    在index.html中添加代码如下 <meta name="referrer" content="no-referrer" /> 如果还是存在问题 ...

  7. 虚拟机安装xp系统教程

    xp和win7安装过程有区别 xp.iso和win7.iso不一样 安装xp必须用特殊方法,此方法的大致步骤如下: 1.VMware新建xp类型的虚拟机 2.进入xp的PE系统 3.在PE系统分2个区 ...

  8. swipe滑动操作

    1.swipe() 滑动用法 swipe(self, start_x, start_y, end_x, end_y, duration=None) :Args: - start_x - 开始滑动的x坐 ...

  9. url请求时,参数中的+在服务器接收时为空格,导致AES加密报出javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher

    报错的意思的是使用该种解密方式出入长度应为16bit的倍数,但实际的错误却不是这个,错误原因根本上是因为在http请求是特殊字符编码错误,具体就是base64生成的+号,服务器接收时成了空格,然后导致 ...

  10. 微信小程序 - scroll-view的scroll-into-view属性 - 在页面打开后滚动到指定的项

    需求: 这是一个可横向滚动的导航条,现在要求我,从别的页面reLaunch回到首页这里,刷新页面内容的同时,菜单项要滚动出来 (如果该菜单项不在可视区域),而不是让他被挡住. 代码:<scrol ...