linux高性能服务器编程 (五) --Linux网络编程基础api
第五章 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的更多相关文章
- Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系. 这节主要介绍三个方面的内容:套接字(so ...
- linux高性能服务器编程
<Linux高性能服务器编程>:当当网.亚马逊 目录: 第一章:tcp/ip协议族 第二章:ip协议族 第三章:tcp协议详解 第四章:tcp/ip通信案例:访问Internet 第五章: ...
- Linux 高性能服务器编程——I/O复用
问题聚焦: 前篇提到了I/O处理单元的四种I/O模型. 本篇详细介绍实现这些I/O模型所用到的相关技术. 核心思想:I/O复用 使用情景: 客户端程序要同时处理多个socket ...
- Linux 高性能服务器编程——高性能服务器程序框架
问题聚焦: 核心章节. 服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...
- Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一 ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
- Linux 高性能服务器编程——TCP/IP协议族
1 TCP/IP协议族体系结构 数据链路层: 职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网.令牌环等)上的传输. 常用协议:ARP协议(地址解析协议),RARP协议 ...
- Linux高性能服务器编程,书中的 shell 命令
记录<Linux高性能服务器编程>书里面讲解到的若干 shell 命令 arp 命令查看ARP高速缓存: [root@VM_0_10_centos heliang]# arp -a ? ( ...
- linux高性能服务器编程 (一) --Tcp/Ip协议族
前言: 在学习swoole入门基础的过程中,遇到了很多知识瓶颈,比方说多进程.多线程.以及进程池和线程池等都有诸多的疑惑.之前也有学习相关知识,但只是单纯的知识面了解.而没有真正的学习他们的来龙去脉. ...
- Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程: 2 读取和设置线程属性: 3 线程同步方式:POSIX信号量,互斥锁和条件变量 ...
随机推荐
- java基础 super和this
/** * super关键字的用法有三种: * 1.在子类的成员方法中,访问父类的成员变量 * 2.在子类的成员方法中,访问父类的成员方法 * 3.在子类的构造方法中,访问父类的构造方法 * * th ...
- C#读写设置修改调整UVC摄像头画面-焦点
有时,我们需要在C#代码中对摄像头的焦点进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...
- 手机端 关闭当前页面的JS
JS 代码如下 PS:我找的原代码中, 注释部分是没有注释的,但是调试的时候报错,就注释掉了,因为我只需要微信和支付宝的判定,所以这个地方,就没仔细研究 var isLppzApp = false ...
- vs2017js 方法注释
vs2017给js方法加注释,就像给C#类似 例如 function test1(a,b,c){ .... } 在function的上一行,打一个 " / " 再连续按两下 &qu ...
- 如何在.Net Mvc中让Get,Post请求访问同一个Action的方法
[HttpPost] [ActionName("Index")] public ActionResult Post(Models.WeChatRequestModel model) ...
- Space Syntax(空间句法)
01 December 2019 13:16 https://spacesyntax.com/ 相关软件:Depthmap 空间句法理论作为一种新的描述建筑和城市空间模式的语言 ...
- 使用JavaConfig配置SpringMVC
目录结构 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ...
- python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述 通过编写程序'模拟浏览器'上网,然后通 ...
- Xcode11 Developer Tool中没了Application Loader
升级Xcode11之后不少人发现在Open Developer Tool中没了Application Loader. 那么如果我们还想用该怎么办呢? 先这样 找个老版的Xcode–>Conten ...
- Java 初识
一.Java 简介 1.什么是 Java Java 语言是美国 Sun 公司(Stanford University Network),在1995年推出的高级的编程语言,所谓编程语言,是计算机的语言, ...