计算机网络笔记(四):Socket编程

2023-11-09

前言

在这里插入图片描述
在这里插入图片描述
几种典型的应用编程接口

  • Berkeley UNIX操作系统定义了一种API,称为套接字接口(socket interface),简称套接字Socket
  • 微软公司在其操作系统中采用了套接字API,形成了一个稍有不同的API,并称之为Windows Socket Interface,WinSock
  • AT&T为其UNIX系统V定义了一种API,简写为TLI(Transport Layer Interface)

Socket API

  • 最初设计:面向BSD Unix-Berkeley,面向TCP/IP协议栈接口
  • 目前:事实上的工业标准,绝大多数操作系统支持
  • Internet网络应用最典型的API接口
  • 通信模型:客户/服务器(C/S)
  • 应用进程间通信的抽象机制
  • 标识通信端点(对外):IP地址+端口号
  • 操作系统/进程如何管理套接字(对内)?套接字描述符(Socket descriptor):进程创建套接字时的返回值

Socket 抽象

  • 类似文件的抽象
  • 当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息
  • 返回套接字描述符

在这里插入图片描述

struct sockaddr_in {
	u_char sin_len;	// 地址长度
	u_char sin_family;	// 地址族
	u_short sin_port;	// 端口号
	struct in_addr sin_addr;	// IP地址
	char sin_zero[8];	// 保留位,置0
}

Socket API 函数(WinSock为例)

WSAStartup 函数

使用Socket的应用程序在使用Socket之前必须首先调用WSAStartup函数

int WSAStartup(WORD wVersionRequested,LPWSADATA IpWSAData);

两个参数:

  1. 第一个参数指明程序请求使用的WinSock版本,其中高位字节指明副版本、低位字节指明主版本。
    • 十六进制整数,例如0x102表示2.1版
  2. 第二个参数返回实际的WinSock的版本信息
    • 指向WSADATA结构的指针

例:使用2.1版本的WinSock的程序代码段

wVersionRequested = MAKEWORD(2, 1);
err = WSAStartup(wVersionRequested, &wsaDara);

WSACleanup 函数

应用程序在完成对请求的Socket库的使用,最后要调用WSACleanup函数,解除与Socket库的绑定,释放Socket库所占用的系统资源。

int WSACleanup(void)

Socket 函数

创建套接字,操作系统返回套接字描述符(sd)

sd = socket(protofamily, type, proto);
  1. 第一个参数(协议族):对于TCP/IP协议族,protofamily = PF_INET(TCP/IP)
  2. 第二个参数(套接字类型)
  3. 第三个参数(协议号):0为默认

在这里插入图片描述
CloseSocket 函数

关闭一个描述符为sd的套接字,如果多个进程共享一个套接字,调用closesocket将套接字引用计数减1,减至0才关闭。

int closesocket(SOCKET sd);

一个进程中的多线程对一个套接字的使用无计数:如果进程中的一个现场调用closesocket将一个套接字关闭,该进程中的其他线程也将不能访问该套接字。

Bind 函数

绑定套接字的本地端点地址:IP地址+端口号

int bind(sd, localaddr, addrlen);
  • 套接字描述符(sd)
  • 端点地址
  • 客户程序一般不必主动调用bind函数,操作系统将自动调用。
    在这里插入图片描述

Listen 函数

置服务器端的流套接字处于监听状态。

  • 仅服务器端调用
  • 仅用于面向连接的流套接字
  • 设置连接请求队列大小(queuesize)
int listen(sd, queuesize);

connect 函数

客户端程序调用connect函数来使客户套接字(sd)与特定计算机的特定端口(saddr)的套接字(服务)进行连接。其仅用于客户端。

int connect(sd, saddr, saddrlen);

accept 函数

服务端调用accept函数从处于监听状态的流套接字sd的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户端套接字创建连接通道。

  • 仅用于TCP套接字
  • 仅用于服务器
newsock = accept(sd, caddr, caddrlen);

利用新创建的套接字(newsock)与客户通信,保证服务器可以并发。

send、sendto 函数

send函数TCP套接字(客户与服务器)或调用了connect函数的UDP客户端套接字。
sendto函数用于UDP服务器端套接字与未调用connect函数的UDP客户端套接字。

send(sd, *buf, len, flags);
sendto(sd, *buf, len, flags, destaddr, addrlen);

recv、recvfrom 函数

recv函数从TCP连接的另一端接收数据,或者从调用了connect函数的UDP客户端套接字接收服务器发来的数据。
recvfrom函数从UDP都武器端套接字与未调用connect函数的UDP客户端套接字接收对端数据。

recv(sd, *buffer, len, flags);
recvfrom(sd, *buf, len, flags, sendaddr, saddrlen);

setsockopt、getsockopt 函数

setsockopt() 函数用来设备套接字sd的选项参数
getsocket()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。

int setsocketopt(int sd, int level, int optname, *optval, int optlen);
int getsocketopt(int sd, int level, int optname, *optval, socklen_t optlen);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据解析

网络字节顺序

TCP/IP 定义了标准的用于协议头中的二进制整数表示:网络字节顺序(network byte order)。

某些Socket API函数的参数需要存储为网络字节顺序(如IP地址、端口号等)。这时候需要实现本地字节顺序与网络字节顺序转换的函数:

  • htons:本地字节顺序 -> 网络字节顺序(16bits)
  • ntohs:网络字节顺序 -> 本地字节顺序(16bits)
  • htonl:本地字节顺序 -> 网络字节顺序(32bits)
  • ntohl:网络字节顺序 -> 本地字节顺序(32bits)

解析服务器IP地址、端口号

客户端可能使用域名(如:study.163.com)或 IP地址(如:123.58.180.121)表示服务器。IP协议需要使用32位二进制IP地址。

需要将域名或IP地址转换为32位IP地址。

  • 函数inet_addr()实现点分十进制IP地址到32位IP地址转换
  • 函数gethostbyname()实现域名到32位IP地址转换:返回一个指向结构hostent的指针

客户端还可能使用服务名(如HTTP)表示服务器端口。

需要将服务名转换为熟知的端口号。

  • 函数getservbyname():返回一个指向结构servent的指针

解析协议号

客户端可能使用协议名(如:TCP)指定协议,需要将协议名转换为协议号(如:6)。

  • 函数getprotobyname()实现协议名到协议号的转换:返回一个指向结构protoent的指针

TCP/UDP客户端软件流程

TCP:

  1. 确定服务器IP地址与端口号
  2. 创建套接字
  3. 系统自动分配本地端点地址(IP+端口号)
  4. 连接服务器(套接字)
  5. 遵循应用层协议进行通信
  6. 关闭/释放连接

UDP:

  1. 确定服务器IP地址与端口号
  2. 创建套接字
  3. 系统自动分配本地端点地址(IP+端口号)
  4. 指定服务器端点地址,构造UDP数据报
  5. 遵循应用层协议进行通信
  6. 关闭/释放套接字

服务器软件设计

四种类类型基本服务器

  • 循环无连接服务器(iterative connectionless)
  • 循环面向连接服务器(iterative connection-oriented)
  • 并发无连接服务器(concurrent connectionless)
  • 并发面向连接服务器(concurrent connection-oriented)

循环无连接服务器(iterative connectionless): 一次只处理一个客户的服务请求,直到这个服务请求处理完毕。

在这里插入图片描述
循环面向连接服务器(iterative connection-oriented)
在这里插入图片描述
并发无连接服务器(concurrent connectionless)

在这里插入图片描述

并发面向连接服务器(concurrent connection-oriented)
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络笔记(四):Socket编程 的相关文章

  • redhat 文件服务器,几个重要的RedHat Linux内核文件详细介绍

    在网络中 不少服务器采用的是Linux系统 为了进一步提高服务器的性能 可能需要根据特定的硬件及需求重新编译Linux内核 编译Linux内核 需要根据规定的步骤进行 编译内核过程中涉及到几个重要的文件 比如对于RedHat Linux 在
  • Handler与异步消息处理

    Handler 在 Android 中的应用很广泛 基本上每个 android 开发人员都会使用到它 本篇文章将会介绍 Handler 和异步消息机制相关的使用方法 下一篇会从源码的角度分析 Android 中异步消息处理的流程 Andro
  • javascript/nodejs 中获取当前时间

    javascript nodejs 中获取当前时间 昨天 今天 明天 我们在开发中 经常要获取的今天 昨天 和明天的日期 下列有个记录能够获得今天 昨天 明天的日期 并且格式化输出 首先我们需要扩展Date对象的Format函数 1 2 3
  • LTE上行RS的SINR

    每个UE的上行SRS都放置在一个子帧的最后一个块中 SRS的频域间隔为两个等效子载波 所以一个UE的SRS的干扰只来自于其他UE的SRS SINR SRS接收功率 干扰功率 噪声功率 SRS接收功率 SRS发射功率 链路损耗 干扰功率 邻小
  • LeetCode 942. 增减字符串匹配

    由范围 0 n 内所有整数组成的 n 1 个整数的排列序列可以表示为长度为 n 的字符串 s 其中 如果 perm i lt perm i 1 那么 s i I 如果 perm i gt perm i 1 那么 s i D 给定一个字符串
  • 面试官:为什么data属性是一个函数而不是一个对象?

    一 实例和组件定义data的区别 vue实例的时候定义data属性既可以是一个对象 也可以是一个函数 const app new Vue el app 对象格式 data foo foo 函数格式 data return foo foo 组
  • 标签显示不出图片——图片路径问题

    引言 大家在进行开发的过程中 经常会有显示图片这个需求 但是却经常因为种种问题显示不了 接下来 我将详细叙述这个问题 希望对大家有所帮助 图片显示不出 一般有三个问题 一 图片所在路径错误 1 使用绝对路径 解决方法 右键查看图片的详细属性

随机推荐

  • js localStorage

    localStorage是H5提供的永久存储空间 一般最大可存储5M数据 并且支持跨域隔离 他的出现极大提高了前端开发的可能性 localStorage的使用很多人都知道setItem getItem removeItem 但他也可以直接以
  • 放弃apollo到自己研发,全局码表系统。

    背景 码表都见过 每个系统都有自己的码表 每个用户 2B 都有自己码表 这里不是说每个客户端自定义 apollo是配置中心 这和码表的功能不一样 码表更侧重数据库用int类型代替varchar类型 以节约存储空间 之前码表的使用 在后端用子
  • RKD知识蒸馏实战:使用CoatNet蒸馏ResNet

    文章目录 摘要 最终结论 数据准备 教师网络 步骤 导入需要的库 定义训练和验证函数 定义全局参数 图像预处理与增强 读取数据 设置模型和Loss 学生网络 步骤 导入需要的库 定义训练和验证函数 定义全局参数 图像预处理与增强 读取数据
  • 高防cdn和高防服务器有什么不一样?

    高防cdn 相信很多看过我们文章的小伙伴对cdn已经很了解了 cdn的原理很简单 就是构建在网络上的很多个节点 为网站作内容 分发 使用户就近获取所需资源 且分配的cdn节点都是高防节点 每个节点都有防御功能 还可以帮助用户隐藏真实ip 高
  • 记mac虚拟机parallels安装银河麒麟V10系统步骤及问题

    1 银河麒麟官网下载系统 银河麒麟操作系统 麒麟操作系统 中标麒麟 麒麟软件官方网站 选择桌面操作系统V10并申请试用 下载桌面操作系统AMD64版 2 parallels安装麒麟系统 1 新建 选择 安装windows或其他操作系统 没找
  • Eclipse导入项目左下角有感叹号/红叉

    Eclipse导入项目左下角有感叹号 红叉 左下角的红色感叹号 导致原因 解决办法 项目左下角红叉 导致原因 解决办法 END 左下角的红色感叹号 导致原因 build path 出现问题 里面有缺失或者无法找到的包 显示红色感叹号是因为j
  • 写一个python接口自动化测试框架

    安装依赖库 在开始编写Python接口自动化测试框架之前 需要安装一些必要的依赖库 您可以使用pip命令安装 pip install requests pip install pytest pip install pytest html p
  • (C++)逻辑运算符——与(&&)、或(

    1 逻辑或 OR 运算符 当两个条件中有一个或全部满足某个要求时 则表达式的值为真 条件 一个真或全为真 结果 则为真 备注 如果最左侧的表达式为真时 将不会判断下一个表达式 提高电脑运行效率 2 逻辑与 AND 运算符 当两个条件为真时
  • 邮件附件名乱码问题

    1 在创建邮件前添加 System setProperty mail mime splitlongparameters false 2 在创建MimeMessageHelper对象时添加 MimeMessageHelper messageH
  • 如何录制gif动态图片并在CSDN中插入动态图片

    我们在网上浏览别人的博客时 经常可以看到以gif动态图显示的程序效果演示和代码段 那么如何录制gif动态图片并在CSDN中插入动态图片呢 下面介绍一种简单的方法 了解之后 你也可以将其应用在自己的博客中 以动态图的方式展示程序运行结果 当我
  • redis集群架构详解

    一 集群架构搭建 1 配置 在一台机器上模拟多台机器搭建redis集群 一个集群代表一台物理机 集群1路径 usr local redis redis cluster cluster1 9001 redis conf usr local r
  • C# IQR算法检测异常点

    话不多说 上马 public List
  • Java Web入门之Ajax的用法详解(附代码和实战)

    创作不易 觉得有帮助或需要源码可以点赞关注收藏后评论区留言 文章目录 前言 一 Ajax与传统的Web应用模式的对比 二 Ajax使用的技术 三 XMLHttpRequest对象的具体使用 四 与服务器通信 发送请求与处理响应 五 Ajax
  • Java最全SSM框架教程-学习笔记

    这里写目录标题 Spring快速入门 Spring优势 Spring开发步骤 Spring配置文件 Spring配置数据源 Spring注解开发 SpringMVC SpringMVC概述 SpringMVC快速入门 SpringMVC注解
  • put_user()函数和get_usr()函数介绍

    1 使用的场景 1 内核地址空间和驱动地址空间是隔绝的 不能使用memcpy 函数 必须使用专门的拷贝函数 2 在拷贝大量数据时使用copy to user 和copy from user 函数 拷贝单个数据时 比如某个int型变量 则优先
  • Vue-Router笔记大全

    Vue Router笔记大全 一 路由的本质和分类 1 路由的本质 2 分类 二 后端路由 1 概念和本质 2 SPA Single Page Application 三 前端路由 1 概念和本质 四 实现简易的前端路由 未使用vue ro
  • React-router v6 在 Class 组件和非组件代码中的正确用法

    最近内部正在开发的 react 项目 react router 全线升级到了 v6 版本 v6 版本中很多 API 进行了重构变更 导致很多旧写法失效 下面记录一下 history 模块在 v6 中的用法 一 在封装的 request 等非
  • 2、进程通信

    进程通信 进程通信 1 进程建通信概述 1 目的 2 来源 3 进程间通讯方式包括 2 管道通讯 1 无名管道 2 命名管道 3 信号通讯 4 共享内存 进程通信 1 进程建通信概述 1 目的 为何需要进程间通信 1 数据传输 一个进程需要
  • MySQL中Index与Key的区别

    看似有差不多的作用 加了Key的表与建立了Index的表 都可以进行快速的数据查询 他们之间的区别在于处于不同的层面上 Key即键值 是 关系模型理论中的一部份 比如有主键 Primary Key 外键 Foreign Key 等 用于 数
  • 计算机网络笔记(四):Socket编程

    文章目录 前言 Socket API 函数 WinSock为例 数据解析 网络字节顺序 解析服务器IP地址 端口号 解析协议号 TCP UDP客户端软件流程 服务器软件设计 前言 几种典型的应用编程接口 Berkeley UNIX操作系统定