CSAPP:第十一章 网络编程
CSAPP:第十一章 网络编程
11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口
11.1 客户端服务器模型
每个网络应用都是基于客户端-服务器模型。采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。
客户端-服务器模型的基本操作是事务。一个客户端-服务器事务由以下四步组成。
- 当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
- 服务器收到请求后,解释它,并以适当的方式操作它的资源。
- 服务器给客户端发送一个响应,并等待下一个请求。
- 客户端收到响应并处理它。

11.2 全球IP因特网
客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
全球IP因特网是最著名和最成功的互联网网络实现。每台因特网主机都运行实现TCP/IP协议的软件,几乎每个现代计算机系统都支持这个协议。因特网的客户端和服务器混合使用套接字接口函数和unix I/O函数来进行通信。

11.3 套接字接口
套接字接口是一组函数,它们和Unix I/O函数结合起来,用以创建网络应用。

11.3.1 套接字的地址结构
因特网的套接字地址存放在类型sockaddr_in的16字节结构中。对于因特网的应用,sin_family成员是AF_INET,sin_port成员是一个16位的端口号,sin_addr成员就是一个32位IP地址。IP地址和端口号总是以网络字序(大端模式)存放的。
1/* IP socket address structure */
2struct sockaddr_in {
3 uint16_t sin_family; /* Protocol family (always AF_INET)*/
4 uint16_t sin_port; /* Port number in network byte order */
5 struct in_addr sin_addr; /* IP address in network byte order */
6 unsigned char sin_zero[8]; /* Pad to sizeof(struct sockaddr) */
7};
8
9/* Generic socket address structure for(connect,bind and accept)*/
10struct sockaddr{
11 uint16_t sa_family; /* Protocol family */
12 char sa_data[14]; /* address data */
13};
11.3.2 socket函数
客户端和服务器使用socket函数来创建一个套接字描述符。
1#include <sys/types.h> /* See NOTES */
2#include <sys/socket.h>
3
4int socket(int domain, int type, int protocol);//若成功,返回套接字描述符;失败返回-1
11.3.3 connect函数
客户端通过调用connect函数来建立和服务器的连接。connect函数试图与套接字地址为addr的服务器建立一个因特网连接,其中addrlen是sizeof(sockaddr_in)。connect函数会阻塞,一直到连接成功建立或者发生错误。
1#include <sys/types.h> /* See NOTES */
2#include <sys/socket.h>
3
4int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
11.3.4 bind函数
剩下的套接字函数--bind,listen和accept,服务器用它们来和客户端建立连接。
1#include <sys/types.h> /* See NOTES */
2#include <sys/socket.h>
3
4int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
bind函数告诉内核 addr中的服务器套接字地址和套接字描述符sockfd联系起来
11.3.5 listen函数
客户端是发生连接请求的主动实体。服务器是等待客户端的连接请求的被动实体。默认情况下,内核会认为socket函数创建的描述符对应于主动套接字,它存在于一个连接的客户端。服务器调用listen函数告诉内核,描述符是被服务器使用而不是客户端。
1#include <sys/types.h> /* See NOTES */
2#include <sys/socket.h>
3
4int listen(int sockfd, int backlog);
listen函数将sockfd从一个主动套接字转化为一个监听套接字,该套接字可以接受来自客户端的连接请求.backlog参数暗示了内核在开始拒绝连接请求前,队列中要排队的未完成的连接请求的数量。
11.3.6 accept函数
服务器通过调用accept函数来等待来自客户端的连接请求。
1#include <sys/types.h> /* See NOTES */
2#include <sys/socket.h>
3
4int accept(int listenfd, struct sockaddr *addr, socklen_t *addrlen);
accept函数等待来自客户端的连接请求到达侦听描述符listenfd,然后在addr中填写客户端的套接字地址,并返回一个已连接描述符,这个描述符可以被用来利用Unix I/O函数与客户端通信。
CSAPP:第十一章 网络编程的更多相关文章
- [CSAPP笔记][第十一章网络编程]
第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...
- 深入理解计算机系统 第十一章 网络编程 part1 第二遍
客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的.采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成.服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服 ...
- 深入理解计算机系统 第十一章 网络编程 part2 第二遍
客户端和服务器通过因特网这个全球网络来通信.从程序员的观点来看,我们可以把因特网看成是一个全球范围的主机集合,具有以下几个属性: 1.每个因特网主机都有一个唯一的 32 为名字,称为它的 IP 地址 ...
- 《深入浅出Node.js》第7章 网络编程
@by Ruth92(转载请注明出处) 第7章 网络编程 Node 只需要几行代码即可构建服务器,无需额外的容器. Node 提供了以下4个模块(适用于服务器端和客户端): net -> TCP ...
- Python第十三章-网络编程
网络编程 一.网络编程基础 python 的网络编程模块主要支持两种Internet协议: TCP 和 UDP. 1.1通信协议 通信协议也叫网络传输协议或简称为传送协议(Communications ...
- Java高级程序设计笔记 • 【第4章 网络编程】
全部章节 >>>> 本章目录 4.1 网络基础知识 4.1.1 IP地址 4.1.2 端口号 4.1.3 使用InetAddress 4.1.4 InetAddress 类 ...
- Linux Linux程序练习十一(网络编程大文件发送UDP版)
//网络编程发送端--大文件传输(UDP) #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- 《python核心编程》读书笔记--第16章 网络编程
在进行网络编程之前,先对网络以及互联网协议做一个了解. 推荐阮一峰的博客:(感谢) http://www.ruanyifeng.com/blog/2012/05/internet_protocol_s ...
- 第六章|网络编程-socket开发
1.计算机基础 作为应用开发程序员,我们开发的软件都是应用软件,而应用软件必须运行于操作系统之上,操作系统则运行于硬件之上,应用软件是无法直接操作硬件的,应用软件对硬件的操作必须调用操作系统的接口,由 ...
随机推荐
- 「技巧」如何将Sketch改为深色模式
之前Sketch只能根据mac系统的外观设置变更皮肤.在更新了版本54之后,可以脱离操作系统,在自己的偏好设置中更改外观了. 准备 Sketch 54 更多工具:whose.design 第一步:打开 ...
- Linux下查看文件内容的命令和工具
1.catcat命令主要用来查看文件内容,创建文件,合并文件,追加文件等. 1.1.查看文件 格式:cat 文件名称 说明:这条命令会把文件内容全部输出到显示屏上. cat -n 文件名称:查看文件内 ...
- docker快速搭建几个常用的第三方服务
本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch: 本篇涉及内容深 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之八 || API项目整体搭建 6.3 异步泛型仓储+依赖注入初探
代码已上传Github+Gitee,文末有地址 番外:在上文中,也是遇到了大家见仁见智的评论和反对,嗯~说实话,积极性稍微受到了一丢丢的打击,不过还好,还是有很多很多很多人的赞同的,所以会一直坚持下去 ...
- 1.6W star 的 JCSprout 阅读体验大提升
万万没想到 JCSprout 截止目前居然有将近1.6W star.真的非常感谢各位大佬的支持. 年初时创建这个 repo 原本只是想根据自己面试与被面试的经历记录一些核心知识点,结果却是越写越多. ...
- Kubernetes的污点和容忍(下篇)
背景 继上一篇<Kubernetes的污点和容忍(上篇)>,这是https://kubernetes.io/docs/concepts/configuration/taint-and-to ...
- 美团分布式服务通信框架及服务治理系统OCTO
一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...
- Redis学习笔记~Twenproxy所起到的作用
回到目录 Twenproxy除了可以作为redis的代理,它同样支持memerycached.我这里主要了解Twemproxy在redis集群上的解决方案.Twemproxy除了完美的解决了分片,路由 ...
- 跟王思聪热狗图一样大热的Redis,还不赶紧来Get一下?
前言 不禁喊出一句ig牛逼!哈哈哈 这个话题是不是有点过时了?但说到Redis,真的是被强行灌输的,到处都会被安利Redis,吓得只会mysql和oracle的我,赶紧去get一波.. 数据库种类 关 ...
- Window环境下配置MySQL 5.6的主从复制、备份恢复
1.环境准备 Windows 7 64位 MySQL 5.6 主库:192.168.103.207 从库:192.168.103.208 navicat无法连接MySQL8解决方案 #修改加密规则 A ...