第五章 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. 解决老大难疑惑:指针 vs 引用

    ▶疑问描述 1.  引用reference的本质: 常指针 ——> 什么时候用指针?= 就按Java中的引用变量那样用? ——> 什么时候用引用?  ①函数的入参/返回值时   ②T&am ...

  2. 第一阶段:Java基础 1.JAVA开发介绍---6. Java基本数据类型

    Java 的两大数据类型: 内置数据类型(基本数据类型) 引用数据类型 本数据类型: Java语言提供了八种基本类型.六种数字类型,一种字符类型,还有一种布尔型. byte,short,int,lon ...

  3. JS面向对象设计-理解对象

    不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念, 它把对象定义为"无序属性(基本值.对象.函数)的集合",类似于散列表. 每 ...

  4. 【转载】C#手动往DataTable中末尾新增一行数据

    在C#中的Datatable数据变量的操作过程中,需要手动往DataTable变量的末尾新增一行数据,例如一个实际的例子,我们做数据报表,在最后一行可能需要新增一行DataRow数据作为一个汇总记录, ...

  5. Crontab常用命令总结

    一.启动服务 /sbin/service crond start 二.关闭服务 /sbin/service crond stop 三.重启服务 /sbin/service crond restart ...

  6. 记Html的初次接触

    第一次接触Html是在昨天的培训班体验课上,这一次课我明白了许多. 1.程序语言比我想象中还要多(原来除了C与Java还有这么多) 2.程序员毕业后掌握7种语言是很正常的事(难怪程序员会秃顶) 3.H ...

  7. Linux定时任务运行thinkPHP某个方法

    先上实力: 1.查看正在执行的crontab,用命令crontab  -l ,这样就可以看到哪些任务一直在执行了.2.crontab -e  自动打开文件 编辑定时任务程序 在打开的页面中点击“i”键 ...

  8. OSPF 虚链路

    通过配置OSPF虚链路连接到骨干区域. 实验拓扑 如图所示连接,地址规划如下: 名称 接口 IP地址 R1 f0/0 192.168.10.1/24 R1 f0/1 192.168.20.1/24 R ...

  9. Odoo中的ORM API(模型数据增删改查)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826214.html 一:增 1:create():返回新创建的记录对象 self.create({'na ...

  10. Prometheus(四):Prometheus+Alertmanager 配置邮件报警

    此处默认已安装Prometheus服务,服务地址:192.168.56.200  一.安装Alertmanager 此处采用源码编译的方式安装.首先下载alertmanager的软件包,下载地址:ht ...