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函数与客户端通信。

转载于:https://www.cnblogs.com/ywx123/p/10371897.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] 说下你对指令的理解?

[vue] 说下你对指令的理解&#xff1f; 指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for 是例外情况&#xff0c;稍后我们再讨论)。指令的职责是&#xff0c;当表达式的值改变时&#xff0c;将其产生的连带影响&a…

给数据库字段增加前缀

update users set mobile concat(86-, mobile)

动态表格数据序号从1开始_EXCEL对面的表姐看过来,你真的会给表格添加序号吗?...

原创作者&#xff1a; EH看见星光 转自&#xff1a;Excel星球哈罗&#xff0c;大家好&#xff0c;我是星光&#xff0c;今天给大家总结分享的表格技巧是……序号。什么是序号&#xff1f;序号就是一二三四五上山打老虎……一二三四一二三四像首歌……一二三四二二三四脖子扭扭屁…

[vue] 说说你对MVC、MVP、MVVM模式的理解

[vue] 说说你对MVC、MVP、MVVM模式的理解 MVVM用视图模型代替了MVP中的展示器&#xff0c;视图模型和视图实现了双向绑定&#xff0c;当视图发生变化的时候视图模型也会发生改变&#xff0c;当视图模型变化的时候视图也随之变化。MVP用展示器代替了控制器&#xff0c;而展示器…

设置公共请求参数_基于分布式锁的防止重复请求解决方案(值得收藏)

关于重复请求&#xff0c;指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同&#xff0c;如查询请求)&#xff0c;那其实对于我们没有什么影响&#xff0c;但如果是非幂等的(每次请求都会对关键数据造成影响&am…

linux:vi 替换命令

:s/^.*$/\L&/100 &#xff03;&#xff03;将100行内的小写转换成大写 vi/vim 中可以使用 :s 命令来替换字符串。 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第…

[vue] 你有写过自定义指令吗?自定义指令的生命周期(钩子函数)有哪些?

[vue] 你有写过自定义指令吗&#xff1f;自定义指令的生命周期&#xff08;钩子函数&#xff09;有哪些&#xff1f; bind inserted update componentUpdated unbind个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎…

【niop2016】

D1T1 玩具谜题 my总结&#xff1a; 【luogu1563】【niop2016】玩具谜题 题面 模拟&#xff01;&#xff01;&#xff01; D1T2 天天爱跑步 my总结&#xff1a; 暂无 题面 我太弱了还搞不出来 暴力也不想写 D1T3 换教室 my总结&#xff1a;【niop2016】【luogu1600】…

linux 复制文件或者文件

linux下文件的复制、移动与删除命令为&#xff1a;cp&#xff0c;mv&#xff0c;rm 一、文件复制命令cp 命令格式&#xff1a;cp [-adfilprsu] 源文件(source) 目标文件(destination) cp [option] source1 source2 source3 ... directory 参数说明&…

[vue] 你有看过vue的源码吗?如果有那就说说看

[vue] 你有看过vue的源码吗&#xff1f;如果有那就说说看 看过 看不懂个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

python的哪个模块提供了文件处理方法_Python处理文件路径有哪些方法?

在python中找寻路径的方法有很多&#xff0c;当然也有新方法在不断地更新中。对于新手的python小白来说&#xff0c;肯定是越简单越好用的最受欢迎。小编经过一番找寻&#xff0c;为大家带来两种方法&#xff0c;大家可以根据接受情况选择。老方法&#xff1a;Python的os.path模…

Linux 随机数

一、rand函数 rand函数的简单使用&#xff0c;rand()返回一个[0, RAND_MAX]中的随机数  #include <stdlib.h> #include <stdio.h> #include <time.h>int main() {printf("%d\n", RAND_MAX);//srand(time(NULL));for(int i 0; i < 5; i){print…

微信扫码支付

微信扫码支付&#xff08;laravel&#xff09; 1.未开通微信扫码支付 (1).参照微信扫码支付接入步骤 (2).开通成功之后用分配的商户号登录微信商户平台设置扫码支付的异步回调地址&#xff08;注意&#xff1a;是返给商户后台的回调地址&#xff09; 2.已经开通扫码支付 模…

[vue] 怎么使css样式只在当前组件中生效?

[vue] 怎么使css样式只在当前组件中生效&#xff1f; <style scoped> </style> 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...

文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏&#xff0c;在此类意外事件中&#xff0c;导致文件系统损坏的根本原因在于写文件不是原子操作&#xff0c;因为写文件涉及的不仅仅是用户数据&#xff0c;还涉及元数据(metadata)包括 Superblock、inode bit…

[vue] v-for循环中key有什么作用?

[vue] v-for循环中key有什么作用&#xff1f; 四个字: 性能优化,简述: 让vue在更新数据的时候可以更有针对性的个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

JMeter - 如何创建可重用和模块化测试脚本

概述&#xff1a; 我的应用程序几乎没有业务关键流程&#xff0c;我们可以从中提出不同的业务工作流程。当我试图在JMeter中提出性能测试脚本时&#xff0c;我需要找到一些方法来创建可重用/模块化的测试脚本。这样我就可以创建不同的工作流程。 对于Ex&#xff1a; 让我们考虑…

请求支付宝渠道报错:40006,Insufficient Permissions,ISV权限不足

错误描述&#xff1a; 申请的是支付宝2.0产品&#xff08;如何区分支付宝产品是1.0还是2.0&#xff09;&#xff0c;请求支付宝渠道时&#xff0c;报错&#xff1a; {"code":"40006","msg":"Insufficient Permissions","sub_code…

dll放在unity哪个文件夹下_unity中调用dll文件总结

unity中调用dll文件总结根据收集的资料&#xff0c;对unity中调用dll文件进行总结&#xff0c;目前常用的两种&#xff0c;在给出vs中封装dll文件的步骤。一、调用c#中的dll文件1.1封装dll文件首先新建一个项目然后创建一个类库&#xff0c;例如命名为Csharpusing System;using…

[vue] watch和计算属性有什么区别?

[vue] watch和计算属性有什么区别&#xff1f; 一个是侦听属性&#xff0c;一个是计算属性 2.一个是为了应对复杂的逻辑计算&#xff0c;一个是对数据的变化作出反应 3.一个是只有当缓存改变时才执行&#xff0c;一个是只要从新渲染就会执行 4.一个有缓存&#xff0c;一个没有…