计算机网络开荒2.2-Socket编程

news2024/11/28 13:54:36

文章目录

  • 一、Socket概述
  • 二、Socket API 概述
  • 三、WinSock常用API
    • 3.1 常用API
      • 3.1.1 WSAStartUP
      • 3.1.2 WSACleanup
      • 3.1.3 Socket
      • 3.1.4 Closesocket
      • 3.1.5 bind
      • 3.1.6 listen
      • 3.1.7 connect
      • 3.1.8 accept
      • 3.1.9 send, sendto
      • 3.1.10 recv, recvfrom
      • 3.1.11 etsockopt, getsockopt
    • 3.2 网络字节顺序
  • 四、客户端软件设计
    • 4.1 解析
      • 4.1.1 解析IP
      • 4.1.2 解析端口号
      • 4.1.3 解析协议号
    • 4.2 连接流程
      • 4.2.1 TCP
      • 4.2.2 UDP
  • 五、服务端软件设计
    • 5.1 循环无连接 iterative connectionless
    • 5.2 循环面向连接 Iterative connection-oriented
    • 5.3 并发无连接 Concurrent connectionless
    • 5.4 并发面向连接 Concurrent connection-oriented

一、Socket概述

在这里插入图片描述

Socket(套接字)是一种计算机网络通信机制,它提供了一种统一的编程接口,使得应用程序可以通过网络进行数据传输和通信。在计算机网络中,Socket通常指的是TCP/IP协议栈中的Socket,也就是套接字接口。

Socket具有以下主要作用:

建立连接:Socket提供了客户端与服务器建立网络连接的机制,使得数据可以在不同计算机之间进行传输。

传输数据:Socket提供了数据读写操作的接口,使得应用程序可以通过网络发送和接收数据。

关闭连接:Socket提供了关闭连接的接口,使得已经建立的网络连接可以被释放和关闭。

在OSI七层模型中,Socket位于第四层(传输层),负责处理端到端的数据传输和可靠性。它能够在网络上建立虚拟通道,保证应用程序之间数据的可靠传输,从而实现网络通信和数据交换。

总之,Socket作为一种通用的网络编程接口,为应用程序提供了方便的网络通信功能,是计算机网络中非常重要的组成部分。

在这里插入图片描述

应用编程接口API:就是应用进程的控制权和操作系统的控制权进行转换的一个系统调用接口

  • Berkeley UNIX 操作系统定义了标准API,称为 套接字接口(socket interface) 简称套接字Socket,Linux也是用此标准接口
  • Windows用的是在Socket interface之上封装的API:Windows Socket Interface(WINSOCK)
  • AT&T 为其UNIX系统V定义了一种API,简写为TLI(Transport Layer Interface)

二、Socket API 概述

  • 最初设计
    • 面向BSD UNIX-Berkley
    • 面向TCP/IP协议栈接口
  • Internet网路应用最典型的API接口
  • 通讯模型C/S
  • 应用进程之间通信的抽象机制

在这里插入图片描述

  • 标识通信的段端点(对外):IP+端口

  • 操作系统/系统如何管理套接字(对内)

    • 套接字描述符socket descripotor
  • 在UNIX中,OS是把socket当做文件统一管理

  • 进程创建Socket时,OS分配一个 数据结构 存储Socket相关信息

在这里插入图片描述

Socket数据结构

struct sockaddr_in{
u_char sin_len;  /*地址长度 */
u_char sin_family;  /*地址族(TCP/IP:AF_INET) ,用来面向其他协议栈*/ 
u_short sin_port; /*端口号 */ 
struct in_addr sin_addr;  /*IP地址 */
char sin_zero[8];  /*未用(置0) */
}


三、WinSock常用API

在这里插入图片描述

WSA:Windows Socket Api,和标准API类似,就是在前面加上了WSA,其他基本类似

3.1 常用API

3.1.1 WSAStartUP

使用Socket之前必须首先调用WSASrartUP

int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)

//wVersionRequested:WinSock的版本,16进制参数
//lpWSAData:返回实际WinSock的版本信息

使用2.1版本的WinSock的程序代码段
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );

3.1.2 WSACleanup

完成对请求的Socket库的使用,最后要调用WSACleanup函数

  • 解除与Socket库的绑定
  • 释放Socket所占系统资源
int WSACleanup (void);


3.1.3 Socket

sd = socket(protofamily,type,proto);

//protofamily:协议族 protofamily = PE_INET(TCP/IP)
//type:套接字类型:type = SOCK_STREAM(TCP) /  SOCK_DGRAM(UDP)  /  SOCK_RAW(TCP/IP)
//proto:协议号,默认为0


struct protoent *p;
p=getprotobyname("tcp");
SOCKET sd=socket(PF_INET,SOCK_STREAM,p->p_proto);
  • 创建Socket
  • 返回OS的套接字描述符 sd

在这里插入图片描述
type:套接字类型:type =

  • SOCK_STREAM 流式 面向TCP
  • SOCK_DGRAM 数据报式 面相DUP
  • SOCK_RAW 直接跨越传输层 创建面向IP的协议,需要特殊权限root

3.1.4 Closesocket

int closesocket(SOCKET sd); 
// UNIX:close()
//关闭一个描述符为sd的Socket
//多个进程共享一个套接字,调用close 引用数-1,到0才结束
//一个进程中,多个线程共用一个socket ,无计数,调用closesocket,全部关闭
//return 0 成功关闭

3.1.5 bind

int bind(sd,localaddr,addrlen);
//绑定套接字的本地端点地址 IP+端口
//参数sd:socket 标识符  localaddr:端点结构地址   

//地址通配符:INADDR_ANY

3.1.6 listen

Server端调用,置监听状态,仅用于面向连接的流套接字TCP

int listen(sd,queuesize);
//queuesize设置连接请求 队列  的大小
// 0:成功

3.1.7 connect

仅用于客户端,
调用connect函数来使客户端套接字sd于服务端saddr连接

TCP UDP 都可以

  • TCP:建立TCP连接
  • UDP:不会建立连接,只会指定服务器端点地址
connect(sd,saddr,saddrlen);

3.1.8 accept

在这里插入图片描述

newsock = accept(sd,caddr,caddrlen);

3.1.9 send, sendto

send:TCP套接字 或 调用了 connect函数的UDP客户端套接字
sendto:UDP 中 未调用 connect函数的UDP套接字

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

3.1.10 recv, recvfrom

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

recv:TCP or UDP(调用了connect)
recvfrom:UDP(未调用connect)

3.1.11 etsockopt, getsockopt

int setsockopt(int sd, int level, int optname, *optval, int optlen);
int getsockopt(int sd, int level, int optname, *optval, socklen_t *optlen);

setsockopt:设置套接字sd选项参数
getsockopt:获取任意类型、任意状态 接口 的选项当前值,结果存入optval

3.2 网络字节顺序

网络字节顺序:network byte order
定义了标准的用于协议头中的二进制整数表示
某些Socket API函数的参数需要存储为网络字节顺序:IP 端口

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

在这里插入图片描述

四、客户端软件设计

4.1 解析

4.1.1 解析IP

  • inet_addr() :10进制IP ---- > 32IP地址
  • gethostbyname(): 域名 -----> 32IP地址,返回一个hostent的指针

在这里插入图片描述

4.1.2 解析端口号

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

4.1.3 解析协议号

getprotobyname() : 返回一个指向结构protoent的指针

4.2 连接流程

4.2.1 TCP

  1. 确定IP:prot
  2. 创建Socket
  3. 分配本地端点地址 IP+Port
  4. 链接服务器Socket
  5. 遵循应用层协议进行通信
  6. 关闭/释放连接

4.2.2 UDP

  1. 确定IP:port
  2. 创建socket
  3. 分配本地端点地址 ip + prot
  4. 指定服务器端点地址,构造UDP数据报
  5. 遵循应用层协议进行通信
  6. 关闭/释放连接

五、服务端软件设计

5.1 循环无连接 iterative connectionless

  1. 创建Socket
  2. 绑定端点地址 INADDR + Port
  3. 反复接受来自客户端请求
  4. 遵循应用层协议,构造相应报文,发送给客户

在这里插入图片描述

5.2 循环面向连接 Iterative connection-oriented

在这里插入图片描述

5.3 并发无连接 Concurrent connectionless

在这里插入图片描述

5.4 并发面向连接 Concurrent connection-oriented

在这里插入图片描述

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

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

相关文章

H3C 交换机的VXLAN二层转发配置

H3C 交换机的VXLAN二层转发配置 本篇介绍H3C交换机的VXLAN二层转发配置。 基本概念: 首先了解VXLAN(Virtual eXtensible LAN,可扩展虚拟局域网络)的基本概念。VXLAN是基于IP网络、采用“MAC in UDP”封装形式的二层VPN技术。VXLAN可以基于…

Vue.js 中的 v-bind 指令详解

Vue.js 中的 v-bind 指令 介绍 Vue.js中的v-bind指令是一种将组件的属性绑定到Vue实例的数据的方式。v-bind指令可以用于将任何组件属性绑定到Vue实例的数据上,例如class、style、属性等。v-bind指令允许我们动态地设置组件的属性,从而使组件更加灵活和…

案例精述丨Fortinet SASE 护航跨国公司中国区网络安全升级

在全球数字化转型大潮下,跨国公司的机构、设施、人员等全球分布式特性,不但带来了广域网建设的网络复杂性,也带来了更加严峻的安全挑战。某全球知名跨国公司,在中国区进行网络安全升级改造的过程中,采用国内某IDC运营商…

阿里巴巴序列模型梳理

SIM:基于搜索的用户终身行为序列建模 论文:《Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Through Rate Prediction》 下载地址:https://arxiv.org/abs/2006.05639 1、用户行为序列建模回顾 1…

JDK8-1-Lambda表达式(3)-函数式接口

JDK8-1-Lambda表达式(3)-函数式接口 有且仅有一个抽象方法的接口称为函数式接口,上文 中 java.util.function.Predicate 接口就是一个函数式接口,Java 8中引入的函数式接口定义在 java.util.function 包下 java.util.function.P…

【PWN · ret2text 格式化字符串漏洞 | NX | Canary | PIE】[深育杯 2021]find_flag

这一题最终的攻击手段可以是简单的ret2text(后门函数给出),然而保护全开则确实让人汗颜。。。 更重要的是!docker的程序偏移和本地不一样!!NSSCTF题目有问题!! 目录 前言 一、题目…

openEuler22+GreatSQL+dbops玩转MGR

芬达,《芬达的数据库学习笔记》公众号作者,开源爱好者,擅长 MySQL、ansible。 背景 openEuler 是什么 openEuler22.03 LTS 是 openEuler 社区于 2022 年 3 月发布的开源操作系统(从系统版本的命名不难发现吧)。openE…

apktool for mac

安装步骤 1、Apktool下载 安装apktool Apktool下载 macOS: Download Mac wrapper script (Right click, Save Link As apktool)Download apktool-2 (find newest here)Rename downloaded jar to apktool.jarMove both files (apktool.jar & apktool) to /usr/local/bin …

sqoop系列:sqoop(离线数据同步)开发案例

目录 Apache Hadoop生态-目录汇总-持续更新 1:Mysql(RDBMS)与Hive/HDFS数据传输 1.1:列出MySQL数据有哪些数据库: 1.2:根据mysql表结构创建hive表 1.3: RDBMS导入到hdfs (1)条件导入 (2&…

cisp证书含金量如何网络安全渗透测试工程师主要工作是什么?前景如何?

sp,国家注册信息安全专业工作员,由中国信息安全测评中心认证,作为我国目前网络安全认证之一!cisp属于国家测评中心授予,目前遭到企业认可。 CISP在大部分网络安全行业变成了应聘求职的必考的证书。在信息安全行业&…

CentOS 7安装 Postgres

零、前置条件 系统CentOS 7,并已联网,已安装gcc或者g编译器,GNU make版本3.80或以上,系统有至少一个除root之外的普通用户user gcc安装-参考链接查看make命令的版本——make --version更新make版本-参考链接postgresql的使用一般…

年薪百万的高性能计算工程师很难学吗?听OpenBLAS创始人怎么说 ..

想要成为一名高性能计算工程师,入门并掌握相关基础并不困难。 关键在于兴趣和自驱力,因为这是一个偏向底层开发的领域,需要扎实的C和C编程基础。 另外,数学能力也很重要,因为算法开发涉及一些基础的数学知识。对于大部…

【支付平台】java springboot 通过ip获取所在地城市信息

如果只是想知道如何通过ip获取所在地城市信息,可直接看第三步. 如果搭建自己的支付平台,异地支付限制是必不可少的一环.因为市面上一些非法份子,会使用我们平台生成的付款码进行欺诈行为.这也是我们必须杜绝的一种现象.因此限制异地支付就是其中一种手段. 在上一篇文章【三方支…

Golang context 实现原理与源码解读

0 context入门介绍 context是Golang应用开发常用的并发控制技术,主要在异步场景中用于实现并发协调以及对 goroutine 的生命周期控制,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以控制多级的goroutine。 con…

【Android】WMS(一)Window的类型和标志

Window、WindowManager、WMS区别 Window: Window 是 Android 中的一个视图容器,代表整个屏幕或 Activity 的一部分。每个 Window 都有自己的 Surface 对象,Surface 对象具有绘制和渲染功能,可以显示 View 和其他元素。在 Android…

Vue 的基础知识 - 判断, 循环, 事件, 通信

目录 1. 了解 Vue 七大常用属性 2. 文本插值 2.1 v-bind 绑定元素 3. 判断 4. 循环 5. 事件 6. 双向绑定 7. 自定义组件 8. Axios 异步通信 8.1 什么是Axios 8.2 为什么要使用 Axios 8.3 Axios 的简单应用 8.4 Vue 的生命周期 1. 了解 Vue 七大常用属性 1. el 属性…

Qt扫盲-Bar柱状图理论

Bar柱状图理论 一、QAbstractBarSeries1. 常用设置2. 管理 BarSet 二、QBarSerie 和 QHorizontalBarSeries1. 垂直柱状图2. 水平柱状图 二、QPercentBarSeries 和 QHorizontalPercentBarSeries1. 垂直比例图2. 水平比例图 三、QStackedBarSeries 和 QHorizontalStackedBarSerie…

忠诚之源:如何获得铁粉?

文章目录 一、铁粉二、如何吸引和留住铁粉的想法2.1 了解你的目标铁粉2.2 提供有价值的内容2.3 建立良好的关系2.4 持续优化和创新 三、具体可采用的一些方法3.1 提供优质内容3.2 社交媒体互动3.3 创建独特的品牌形象3.4 提供特殊待遇和奖励3.5 参与社区和活动3.6 持续互动和更…

如何把视频语音转换成文字,分享给大家几个免费的方法!

在日常工作和学习中,有时需要将视频中的语音转录为文字,以便整理成文稿或进行其他用途。手动打字效率低下且耗时费力,那么如何快速将语音转换为文字呢?下面介绍几种简单高效的方法,其中之一是使用记灵在线工具。 方法…

PHP的流程控制语句

一.流程控制语句 1.if语句 PHP的if语句格式如下 if(表达式) 语句; 如果表达式的值为真,那么久顺序执行语句;否则,就会跳过该条语句,再往下执行。如果要执行的语句不指一条则用{},{}被称为语句组,格式如…