[Linux网络编程]02-Socket编程

一.套接字(Socket)

在通信过程中,套接字一定是成对出现的(通信双方各持一个)

一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现读写),即一个套接字只有一个文件描述符,但有两个缓存区,与管道正好相反。

Linux套接字实现原理:
在这里插入图片描述

二.预备知识

1.网络字节序和本地字节序
内存中的多字节数据相对于内存地址有大端小端之分

小端法:(PC本地存储)高位存高地址,低位存低地址
大端法:(网络存储)高位存低地址,低位存高地址

网络的数据流采用大端字节序,而本地数据流采用小端字节序.
因此要通过函数来转换:
htonl : 本地 -->网络 (IP)
htons : 本地 --> 网络 (port端口)
ntohl : 网络 --> 本地 (IP)
ntohs : 网络 --> 本地 (port)

在这里插入图片描述
此函数转换端口号字节序容易,但是进行IP的大小端转换比较麻烦,因为linux中ip为字符串类型,而函数需要的是整数,需要经过多次转换,所以linux提供了以下封装好的转换函数inet_pton / inet_ntop。

2. ip转换函数
两个函数,inet_ptoninet_ntop

int inet_pton(int af,const char *src, void *dst)
本地字节序—>网络字节序

参数:
af:AF_INET、AF_INET6 ------------------>宏,分别对应IPV4和IPV6
src:传入,IP地址(点分十进制)
dst:传出,转换后的 网络字节序的 IP地址

返回值:
成功:1
异常: 0,说明src指向的不是一个有效的ip地址。
失败:-1

const char *inet_ntop(int af, const void *src, char *dst,socklen t size)
网络字节序 —>本地字节序
参数:
af:AF INET、AF INET6
src:网络字节序IP地址
dst:本地字节序(stringIP)
size:dst 的大小。

返回值:
成功:dst
失败:NULL

3.sockaddr数据结构
头文件#include <arpa/inet.h>
网络操作函数大部分需要的参数类型为sockaddr类型,这是为了向前兼容。
但实际使用时,我们先利用sockaddr_in将结构体内容设置好,然后再利用指针转化为sockaddr类型。

在这里插入图片描述
在这里插入图片描述1. sin_family:表示你要使用的地址结构类型,AF_INET是IPV4,AF_INET6是IPV6;
2. sin_port:网络字节序的端口号,因此要使用htons转换一下;
3. struct in_addr:一个结构体,里面有一个s_addr,要传入网络字节序的ip地址,因此要使用inet_pton函数;也可以使用第二种方法,宏,如INADDR_ANY(任意可用IP地址)

三.Socket编程函数

虽然说网络通信,socket成对出现,但实际上一次通信,会存在多个Socket。

当服务器端调用socket函数时会产生一个套接字,而accept函数会阻塞监听客户端连接,当有客户端连接的时候 该函数会返回一个新的套接字去和客户端连接,旧的套接字用以监听连接,因此一个socket通信模型中,会有三个套接字存在(客户端,服务端(由accept函数返回)和 监听socket)

通信模型图解:
在这里插入图片描述客户端:socket()创建套接字,connect()建立连接。
服务端:socket()创建套接字,bind()绑定ip和端口,listen()用来设置与服务端连接的客户端数量上线,accept()则用于结束客户端连接,没有请求时则阻塞在该函数上。

1.socket()

头文件: #include <sys/socket.h>
int socket(int domain, int type, int protocol); 创建一个套接字
参数:
domain:ip版本,AF_INET或AF_INET6
type:数据传输协议 SOCK_STREAM(流式协议,TCP)或SOCK_DGRAM(UDP)
protocol:默认传0,根据type来选择,SOCK_STREAM的代表协议是TCP,SOCK_DGRAM的是UDP

返回值:
成功:新套接字所对应的文件描述符;失败:-1 error

2.bind()
给socket通过sockaddr结构体绑定地址结构的函数

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:
sockfd:socket文件描述符
addr:传入参数 (struct sockaddr *)&addr
addrlen:sizeof(addr) 地址结构的大小

返回值:
成功是0,失败-1 error

3.listen 函数

设置同时与服务器建立连接的上限数(同时进行3次握手的客户端数量);
int listen(int sockfd, int backlog);

参数:
sockfd:socket文件描述符
backlog:上限数值

返回值:
成功是0,失败-1 error

4.accept函数

阻塞等待客户端建立连接,成功的话 返回一个与客户端成功连接的socket文件描述符。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:
sockfd:socket的返回值
addr:传出参数,成功与服务器建立连接的那个客户端的地址结构(ip+端口)
addrlen:&clit_addr_len 传入传出参数,入:addr的大小 出:客户端addr的实际大小
socklen_t clit_addr_len = sizeof(addr); &clit_addr_len
返回值:
成功:能与服务器进行数据通信的 socket 对应的文件描述符
失败:-1 error

5.connect函数
客户端使用,使用现有的socket与服务器建立连接的函数

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd:socket的返回值
addr:服务器的地址结构
addrlen:服务器地址结构的长度
返回值:
成功:0 失败:-1 error

四.C-S模型通信案例实现

SERVER

  1 #include<iostream>2 #include<unistd.h>3 #include<fcntl.h>4 #include<sys/socket.h>5 #include<arpa/inet.h>6 #include<ctype.h>7 using namespace std;8 int main()9 {10   //1.socket11   int fd,sfd;12   fd = socket(AF_INET,SOCK_STREAM,0);//AF_INET ->IPV4  SOCK_STREAM -> TCP13   //2.bind14   struct sockaddr_in serv_addr,client_addr;15   serv_addr.sin_family = AF_INET ;16   serv_addr.sin_port = htons(9527);17   serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);  //宏,INADDR_ANY,系统选择可用ip        18   bind(fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));19   //3.listen20   listen(fd,128);21   //4.accept22   socklen_t clientaddr_len;  23   clientaddr_len = sizeof(client_addr);24   sfd =  accept(fd,(struct sockaddr*)&client_addr,(socklen_t*)&clientaddr_len);25   if(sfd == -1)                                                                                               26   {27      perror("accept error");28      exit(0);29   }30   //取出client_addr,利用inet_ntop和ntohs获取客户端地址结构:ip,端口等31   char client_ip[1024];32   cout<<"ip:"<<inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_ip,sizeof(client_ip))<<endl;33   cout<<"port:"<<ntohs(client_addr.sin_port)<<endl;34   //5.连接完成,处理逻辑35   char buf[BUFSIZ];36  while(true)37  {38   int p = read(sfd,buf,sizeof(buf));//接收客户端数据39   write(STDOUT_FILENO,buf,p);40   for(int i = 0;i<p;i++)41     {42      buf[i] = toupper(buf[i]);43     }44   write(sfd,buf,p);  //发给客户端45  }46   return 0;47 }

CLIENT

#include<iostream>2 #include<unistd.h>3 #include<sys/socket.h>4 #include<arpa/inet.h>5 using namespace std;6 7 int main()8 {9   int fd;10   //1.socket11   fd = socket(AF_INET,SOCK_STREAM,0);12   //2.connet13   struct sockaddr_in sockaddr;14   sockaddr.sin_family = AF_INET;15   sockaddr.sin_port = htons(9527);16   inet_pton(AF_INET,"127.0.0.1",&sockaddr.sin_addr.s_addr);17 18   connect(fd,(struct sockaddr*)&sockaddr,sizeof(sockaddr));19   //3.通信20   char buf[BUFSIZ]; //409621   while(true)22   {   23     write(fd,"hello\n",sizeof("hello\n"));24     int ret = read(fd,buf,sizeof(buf));25     write(STDOUT_FILENO,buf,ret);26     sleep(1);27   }28   return 0;29 }

结果:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

解决k8s集群中安装ks3.4.1开启日志失败问题

问题 安装kubesphere v3.4.1时&#xff0c;开启了日志功能&#xff0c;部署时有三个pod报错了 Failed to pull image “busybox:latest”: rpc error: code Unknown desc failed to pull and unpack image “docker.io/library/busybox:latest”: failed to copy: httpRead…

uniapp使用html2canvas时,页面内的image元素模糊

不废话很简单只需要将image改成img就行 改之前 改之后 原因可能是因为uniapp里面的image标签做了某种处理

QT教程-二十一,Qt动画类

目录 1. QPropertyAnimation 主要功能 示例 2. QVariantAnimation 主要功能 3. QAbstractAnimation 主要功能 4. QAnimationGroup 主要功能 5. QSequentialAnimationGroup 示例 6. QParallelAnimationGroup 示例 7. QEasingCurve 示例 8. 例子,实现一边移动一边…

1.计算机网络_基本知识

基本知识 计算机网络的类别&#xff1a; 1、按作用范围来分类 2、按网络的使用者来分类 什么是计算机网络&#xff1a; 计算机网络由若干个节点和链接这些节点的链路组成&#xff0c;节点可以是计算机、集线器、交换机、路由器等。互联网络是多个网络通过路由器连接在了一起…

具备技术二:正则表达式

一、C正则库 regex 用于报文的解析。 使用接口&#xff1a;bool regex_match(const string &src, smatch &matches, regex &e); src&#xff1a;要解释的字符串。 smatch&#xff1a;一个类似于数组的结构&#xff0c;用于存储一个个解释之后的字符串。 matche…

可视化大屏的C位放啥(02):3D建筑,数据的集大成展示。

3D 建筑以其立体、逼真的形态&#xff0c;瞬间抓住人们的眼球。它不仅仅是一个静态的模型&#xff0c;更是一个承载着丰富数据的载体。通过精细的建模&#xff0c;可以展示建筑的外观、结构、内部布局等多方面信息。 从数据展示的角度来看&#xff0c;3D 建筑可以与各种数据进…

【zookeeper】集群配置

zookeeper 数据结构 zookeeper数据模型结构&#xff0c;就和Linux的文件系统类型&#xff0c;看起来是一颗树&#xff0c;每个节点称为一个znode.每一个Znode默认的存储1MB的数据&#xff0c;每个Znode都有唯一标识&#xff0c;可以通过命令显示节点的信息每当节点有数据变化…

相同的树算法

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

最新开发项目H5商城小程序源码系统 带源代码安装包以及搭建部署教程

系统概述 在当今数字化迅猛发展的时代&#xff0c;电子商务已成为企业拓展市场、提升品牌影响力的重要手段。H5商城小程序作为一种跨平台、轻量级的应用形式&#xff0c;凭借其无需下载安装、即用即走的特性&#xff0c;迅速赢得了广大用户的青睐。为了满足企业对高质量H5商城…

【工具变量】A股上市企业大数据应用(2001-2023年)-参考柏淑嫄实践

数据简介&#xff1a;企业数字化转型的浪潮孕育出大数据&#xff0c;大数据技术是在数据处理和应用中释放大数据多元价值的必要手段。大数据作为企业发展的战略资源和生产要素对企业转型发展具有重要意义。对上市企业大数据应用程度进行测算不仅有助于了解大数据相关技术在企业…

Linux安装部署服务:Nginx和Openresty

Linux安装部署服务&#xff1a;Nginx和Openresty 一、安装环境说明1.1 虚拟机环境1.2 nginx 安装包1.3 openresty 安装包 二、安装 nginx 服务2.1 安装前环境准备2.2 源码安装 nginx2.3 开机自启 nginx 三、安装 openresty 服务3.1 安装前环境准备3.2 源码安装 openresty3.4 离…

执行vue create XXX报错The operation was rejected by your operating system

创建项目&#xff1a; vue create my-project 报错&#xff1a; npm ERR! code EPERM npm ERR! syscall open npm ERR! path D:\Program Files\nodejs\node_cache\_cacache\tmp\5d2a6f8e npm ERR! errno -4048 npm ERR! Error: EPERM: operation not permitted, open D:\Pro…

Svan.的创作纪念日

机缘 大家好&#xff0c;今天是我成为CSDN创作者的1024天&#xff0c;作为一名算是资深社区的博主&#xff0c;我有太多的话想和大家说&#xff0c;但是近几天真的很忙&#xff0c;所以我只用最简洁的话来说一下我一路走来的创作经验和感受&#xff01;&#xff01; 首先说一…

界面组件DevExpress WPF v24.1亮点 - 支持全新的字体图标图像

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.哈希(2)(模拟实现)

1.概念介绍 1.1开散列 开散列&#xff08;Open Hashing&#xff09;&#xff0c;也叫链地址法&#xff0c;是一种解决哈希冲突的方法。每个哈希表槽位保存一个链表&#xff0c;所有散列到同一位置的元素都存储在该链表中。当插入元素发生冲突时&#xff0c;将新元素添加到相应…

Ansible概述

目录 一、ansible简介 二、absible的特点 三、ansible的工作原理以及流程 四、ansible环境安装部署 五、ansible命令行模块 六、inventory 主机清单 一、ansible简介 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。…

HCIP-HarmonyOS Application Developer 习题(十二)

&#xff08;多选&#xff09;1、声明式开发范式的转场动画包含以下哪几种类型? A、页面间转场 B、应用间转场 C、共享元素转场 D、组件内转场 答案&#xff1a;ACD 分析&#xff1a; &#xff08;多选&#xff09;2、公共事件服务为应用程序提供哪些能力。 A、取消发布公共…

基于STM32设计的养殖场环境监测系统(华为云IOT)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】需求总结 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 二、部署华为云物联网平台2.1 物联网平台介绍2.2 开通物联网服务2.3 创建产品&#x…

开源项目 - 轻量级人体姿态 人体关键点检测 机器视觉 深度学习

开源项目 - 轻量级人体姿态 人体关键点检测 机器视觉 深度学习 项目地址&#xff1a;https://gitcode.net/EricLee/light_pose 1、数据集来源&#xff1a;coco2017 数据集 * coco 数据集官方网站&#xff1a;https://cocodataset.org/#home * [数据集下载地址(百度网盘 Pa…

力扣2653.滑动窗口的美丽值

给你一个长度为 n 的整数数组 nums &#xff0c;请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为&#xff1a;如果子数组中第 x 小整数 是 负数 &#xff0c;那么美丽值为第 x 小的数&#xff0c;否则美丽值为 0 。 请你返回一个包含 n - k 1 个整数…