第五章 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. 在Asp.Net Core MVC 3.0 视图运行时编译

    在正常情况下,视图在生成的时候就会变为 xxx.Views.dll,在开发的时候,这样很不方便,因为很多的时候,我们只是修改一个样式,调整一些JavaScript代码,这个时候要把项目调试暂停下来,生 ...

  2. tiny-spring 分析

    tiny-spring 分析 前言 在阅读 Spring 的源代码(依赖注入部分和面向切面编程部分)时遇到不少困惑,庞大的类文件结构.纷繁复杂的方法调用.波诡云谲的多态实现,让自己深陷其中.一头雾水. ...

  3. 笔记:Java Language Specification - 章节17- 线程和锁

    回答一个问题:多线程场景下,有时一个线程对shared variable的修改可能对另一个线程不可见.那么,何时一个线程对内存的修改才会对另一个线程可见呢? 基本的原则: 如果 读线程 和 写线程 不 ...

  4. 【转载】C#中ArrayList集合类使用Add方法添加元素

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,任何数据类型的变量都可加入到同一个ArrayList集合中,因此使用Ar ...

  5. Java 初识

    一.Java 简介 1.什么是 Java Java 语言是美国 Sun 公司(Stanford University Network),在1995年推出的高级的编程语言,所谓编程语言,是计算机的语言, ...

  6. Java 之 数学相关类 Math、BigInteger、BigDecimal

    一.java.lang.Math 类 一.Math 类概述 java.lang.Math 类包含用于执行基本数学运算的方法,如指数.对数.平方根和三角函数.类似于这样的类,其所有方法均为静态方法,并且 ...

  7. 【案例】保健品行业如何优化供应链管理?APS系统来帮忙

    仙乐健康一直致力于为了客户提供世界级的产品及服务,随着业务量的不断扩大,公司先后实施了ERP系统,CRM系统,WMS系统,OA系统,朝着行业信息化水平领先的目标迈进. 但近年仅仅拥有传统ERP系统和手 ...

  8. MES应用案例|新宏泰电器乘上智能制造的东风

    企业背景: 无锡新宏泰电器科技股份有限公司(下文简称:新宏泰电器)创立于1984年,公司主要生产断路器.微型电机.BMC/SMC材料.BMC/SMC模压制品及各类塑料模具的设计制造.已于2016年在沪 ...

  9. 【MySQL】查看建表语句

    命令如下: SHOW CREATE TABLE tbl_name 例子: mysql> show create table m_zhbess_vehicle_report\G ********* ...

  10. rest framework 之序列化

    一.示例 restful work 的序列号就类似于 Django 的 Form 表单. 1.api/urls.py from django.urls import path, re_path fro ...