网络编程-认识套接字socket

文章目录

      • 套接字概念
        • 端口号
        • 网络字节序
      • 套接字类型
        • 流套接字
        • 数据报套接字
      • socket常见API
        • socket函数
        • bind函数
        • listen函数
        • accept函数
        • connect函数
        • sockaddr结构

套接字概念

  socket套接字是进程之间一种通信机制,通过套接字可以在不同进程之间进行数据交流。在TCP/UDP中,“IP+TCP或UDP端口号”可以唯一标识网络通讯中的一个进程,“IP地址+端口号”就是一个socket套接字。
在这里插入图片描述

端口号

  端口号是一个2字节的16位整数,用来标识一个进程,它告诉操作系统 当前这个数据要交给哪个进程来处理。一个端口号只能被一个进程占用,但是一个进程可以有多个端口号。

网络字节序

  TCP/IP协议规定,网络数据流采用大端字节序(高位字节数据存放在内存低地址数,低位字节数据存放在内存高地址数)。不管这台主机是大端机还是小端机都是按照大端字节序来接收数据,不过小端机需要转换一下。

套接字类型

流套接字

  流套接字提供了一个可靠的、面向连接的通信机制,可以顺序地传输数据。在TCP/IP协议中,TCP协议采用的就是流套接字。

数据报套接字

  数据报套接字提供了一种无连接、不可靠的通信机制,数据以独立的数据包形式传输。在TCP/IP协议中,UDP协议采用的就是数据报套接字。

socket常见API

  socket API是一层抽象的网络编程接口,适用于各种底层网络协议。

socket函数
// 创建socket文件描述符(TCP/UDP。客户端+服务器)
int socket(int domain,int type, int protocol);
domain:AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用IPv4的地址AF_INET6 与上面类似,不过是来用IPv6的地址AF_UNIX 本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器在同一台及其上的时候使用
type:SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。SOCK_SEQPACKET该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。SOCK_RAW socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序
protocol:传0 表示使用默认协议。
返回值:成功:返回指向新创建的socket的文件描述符,失败:返回-1,设置errno
bind函数
// 绑定端口号(TCP/UDP,服务器)
int bind(int sockfd const struct sockaddr *address, socklen_t address_len);
sockfd:socket文件描述符
address:构造出IP地址加端口号
addrlen:sizeof(address)长度
返回值:成功返回0,失败返回-1, 设置errno服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。bind()的作用是将参数sockfd和addr绑定在一起,使sockfd这个用于网络通讯的文件描述符 监听addr所描述的地址和端口号。struct sockaddr *是一个通用指针类型,addr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度。
listen函数
// 开始监听socket(TCP,服务器)
int listen(int sockfd, int backlog);
sockfd:socket文件描述符
backlog:挂起的连接队列的最大长度
返回值:成功返回0,失败返回-1
accept函数
// 接收请求(TCP,服务器)
int accept(int sockfd, struct sockaddr* address, socklen_t* address_len);
sockdf:socket文件描述符
address:传出参数,返回链接客户端地址信息,含IP地址和端口号
addrlen:sizeof(address)长度
返回值:成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno当socket模式设置为阻塞,accept函数的功能是阻塞等待client发起三次握手,当3次握手完成的时候,accept解除阻塞,并从全连接队列中取出一个socket,就可以对这个socket连接进行读写操作
connect函数
// 建立连接(TCP,客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockdf:socket文件描述符
addr:传入参数,指定服务器端地址信息,含IP地址和端口号
addrlen:传入参数,传入sizeof(addr)大小
返回值:成功返回0,失败返回-1,设置errno调用connect函数将激发TCP的三次握手过程,而且仅在连接建立成功或出错时才返回
sockaddr结构

  sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了。sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把p目标地址和端口号分开储存在两个变量中。
sockaddr结构

struct sockaddr
{__SOCKADDR_COMMON (sa_);char sa_data[14];
};

sockaddr_in结构

typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};struct sockaddr_in
{__SOCKADDR_COMMON (sin_);in_port_t sin_port;struct in_addr sin_addr;unsigned char sin_zero[sizeof(struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof(in_port_t) -sizeof(struct in_addr)];
};

在这里插入图片描述

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

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

相关文章

如何开发一个prompt?prompt的使用有哪些原则?

提示词使用原则 如何开发一个跟自己预期结果接近的提示词&#xff1f;有哪些基本原则&#xff1f; 提示词迭代开发 写提示词时&#xff0c;第一次尝试是值得的&#xff0c;反复完善提示&#xff0c;获得越来越接近你想要的结果 原文来源于B站吴恩达提示工程教学公开课。…

低代码是美食!!!

一、什么是低代码 低代码是一种软件开发方法&#xff0c;通过图形化界面和少量手写代码&#xff0c;让开发者能够更迅速、简单地构建应用程序。相比传统的编码方式&#xff0c;低代码平台提供了可视化的开发工具和预构建的组件&#xff0c;使开发过程更加快捷高效。 二、低代码…

web前端之复制图片到div中、使用contenteditable属性把元素变为可编辑状态、FileReader

MENU 方式一方式二contenteditableFileReader 方式一 <div id"idEditor" class"w_100_ h_200" contenteditable></div>1、存在兼容性问题&#xff0c;而且contenteditable属性只是把div变为可编辑形式而已&#xff1b; 2、只能处理截屏形式的图…

ActionCLIP:A New Paradigm for Video Action Recognition

文章目录 ActionCLIP: A New Paradigm for Video Action Recognition动机创新点相关工作方法多模态框架新范式预训练提示微调 实验实验细节消融实验关键代码 总结相关参考 ActionCLIP: A New Paradigm for Video Action Recognition 论文&#xff1a;https://arxiv.org/abs/21…

7-5 时间类(Java for PTA)

设计一个名为Time 的类。这个类包含&#xff1a; 表示时间的数据域hour、minute 和second。一个以当前时间创建Time 对象的无参构造方法&#xff08;数据域的值表示当前时间&#xff09;。一个构造Time 对象的构造方法&#xff0c;这个对象有一个特定的时间值&#xff0c;这个…

服务端主动给客户端发消息?实战教学:使用Nestjs实现服务端推送SSE

前言 服务端消息推送SSE是常用的服务器消息通信手段&#xff0c;适用于服务器主动给客户端发送消息的场景&#xff0c;例如私信通知&#xff0c;扫描登录等都可以使用SSE实现。SSE的底层原理是客户端与服务端建立 HTTP 长链接。 Nestjs 框架内置了对SSE的支持&#xff0c;本文…

【算法】【动规】环绕字符串中唯一的子字符串

跳转汇总链接 &#x1f449;&#x1f517;动态规划算法汇总链接 1.5 环绕字符串中的子字符串 &#x1f517;题目链接 定义字符串 base 为一个 “abcdefghijklmnopqrstuvwxyz” 无限环绕的字符串&#xff0c;所以 base 看起来是这样的&#xff1a; "...zabcdefghijklmnop…

ES6 面试题 | 15.精选 ES6 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

C++:函数重载

1.函数重载概念 函数重载就是用同一个函数名定义的不同函数&#xff0c;当函数名和不同的参数搭配时函数的功能和含义不同。 2.实现函数重载的条件 同一个作用域&#xff0c;参数个数不同或者参数类型不同或者参数顺序不同(满足一个即可) void func(){} void func(int x){} v…

2024美赛全方位备赛教学/翻译/写作模版/翻译/软件/资料

本文字数20000&#xff0c;文章较长&#xff0c;建议先看目录&#xff0c;点击目录条目可以快速跳转。2024美赛大学生数学建模竞赛即将开始&#xff0c;不知道大家是否已经准备好相关资料如写作模板、常见算法的编程代码等等&#xff1f;评论区处有这些资料的下载方式。 文章结…

计算机网络:数据链路层(广域网、PPP协议、HDLC协议)

今天又学会了一个知识&#xff0c;加油&#xff01; 目录 一、广域网 二、PPP协议 1、PPP协议应满足的要求 2、PPP协议无需满足的要求 3、PPP协议的三个组成部分 4、PPP协议的状态图 5、PPP协议的帧格式 三、HDLC协议 1、HDLC的站&#xff08;主站、从站、复合站&…

定积分的应用@元素法@微元法@平面图形面积

文章目录 abstract微元法(元素法)微元法的步骤 平面图形的面积直角坐标系上图形面积参数方程确定的曲线所围成的图形面积例 极坐标上图形面积&#x1f47a;曲边扇形面积曲扇环面积 应用例例 abstract 微元法定积分的应用平面图形面积体积弧长 微元法(元素法) 定积分(一重,二…

计算机网络:网络层(无分类编址CIDR、计算题讲解)

带你快速通关期末 文章目录 前言一、无分类编址CIDR简介二、构成超网三、最长前缀匹配总结 前言 我们在前面知道了分类地址&#xff0c;但是分类地址又有很多缺陷&#xff1a; B类地址很快将分配完毕!路由表中的项目急剧增长! 一、无分类编址CIDR简介 无分类域间路由选择CI…

【后端学前端】第四天 css动画 垂直轮播效果(css变量、位移缩放动画、动画延迟)

1、学习信息 视频地址&#xff1a;css动画 垂直轮播效果&#xff08;css变量、位移缩放动画、动画延迟&#xff09;_哔哩哔哩_bilibili 2、源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title…

深入理解——快速排序

目录 &#x1f4a1;基本思想 &#x1f4a1;基本框架 &#x1f4a1;分割方法 ⭐Hoare版本 ⭐挖坑法 ⭐前后指针法 &#x1f4a1;优化方法 ⭐三数取中法 ⭐小区间内使用插入排序 &#x1f4a1;非递归实现快速排序 &#x1f4a1;性能分析 &#x1f4a1;基本思想 任取待排…

【代码随想录】算法训练计划51

dp 1、309. 买卖股票的最佳时机含冷冻期 题目&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&…

CSS中控制元素水平布局的七个属性

元素的水平方向的布局 元素在其父元素中水平方向的位置由一下几个属性共同决定 margin-left border-left padding-left width padding-right border-right margin-right 一个元素在其父元素中&#xff0c;水平布局必须要满足以下…

【redis,nosql】redis键值数据库

什么是redis数据库 Redis is an open source, in-memory data structure store used as a database, cache, message broker, and streaming engine. 存储模式 字符串&#xff08;String&#xff09; Redis strings store sequences of bytes, including text, serialize…

webpack的配置与优化

webpack 启动命令配置 在package.json中配置启动命令 除了 npm start 外 运行dev和build都需要加 run 例&#xff1a;npm run build "scripts": {"start": "npm run dev", //启动开发模式 简化命令"dev": "npx webpack serve -…

力扣刷题-二叉树-二叉树左叶子之和

404 左叶子之和 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 思路 迭代法 迭代法理解…