【网络】:网络套接字

网络套接字

  • 一.网络字节序
  • 二.端口号
  • 三.socket
    • 1.常见的API
    • 2.封装UdpSocket

网络通信的本质就是进程间通信。

一.网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  1. 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  2. 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  3. 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  4. TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
  5. 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
  6. 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

在这里插入图片描述

这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回 ; 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。

二.端口号

在进行网络通信中,下三层主要解决的是数据可靠的传输到远端机器,而应用层主要是来处理数据的。而应用层有很多程序,例如:微信,抖音…底层如何知道这个数据传给哪一个呢?这时就要引入端口号了。

在这里插入图片描述

端口号(port)是传输层协议的内容:

  1. 端口号是一个2字节16位的整数;
  2. 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  3. IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
  4. 一个端口号只能被一个进程占用

在这里插入图片描述

IP地址能表示唯一的主机,port端口号能标识该主机上唯一的进程。当两者连在一起时,我们就能准确的找到目的机器的具体接收信息的应用了。这种IP+port方式就叫做socket.

三.socket

1.常见的API

在这里插入图片描述

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4,IPv6,以及后面要讲的UNIX DomainSocket. 然而, 各种网络协议的地址格式并不相同

在这里插入图片描述

  1. IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址.
  2. IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.
  3. socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;

2.封装UdpSocket

#pragma once#include<iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<strings.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include "log.hpp"extern Log log;std::string defaultip="0.0.0.0";
uint16_t defaultport=8080;
const int size=1024;enum{SOCKET_ERR=1,BIND_ERR
};class UdpServer
{
public://初始化端口号,ip号UdpServer(const uint16_t &port=defaultport,const std::string &ip=defaultip): port_(port),ip_(ip){}void init(){//创建udp socketsockfd_=socket(AF_INET,SOCK_DGRAM,0);if(socket<0)//创建失败{log(Fatal,"socket create error: %d",sockfd_);exit(SOCKET_ERR);}log(Info,"create socket sucess:%d",sockfd_);//绑定端口号struct sockaddr_in local;//将该结构体内部清零bzero(&local,sizeof(local));//填充结构体local.sin_family=AF_INET;//表明自己的结构体类型local.sin_port=htons(port_);//绑定的端口号,需要保证我的端口号是网络字节序列(大端),因为要发送给对方,所以htos转换local.sin_addr.s_addr=inet_addr(ip_.c_str());//绑定的ip,1.ting->uint_32 2.必须是网络序列的//上面的全部定义在用户栈上,并没有与内核绑定//绑定内核int n=bind(sockfd_,(const struct sockaddr*)&local,sizeof(local));if(n<0)//绑定失败{log(Fatal,"bind error,error:%s",strerror(errno));exit(BIND_ERR);}log(Info,"bind sucess:%d",sockfd_);}void run(){isrunning=true;while(isrunning){char inbuffer[size];struct sockaddr_in client;//客户端结构体socklen_t len=sizeof(client);ssize_t n=recvfrom(sockfd_,inbuffer,sizeof(inbuffer)-1,0,(struct sockaddr*)&client,&len);if(n<0){log(Warning,"recvform err,err string:%s",strerror(errno));continue;}inbuffer[n]=0;//简单的数据处理std::string info=inbuffer;std::string echo_string="server echo"+info;//将数据发回sendto(sockfd_,echo_string.c_str(),echo_string.size(),0,(const sockaddr*)&client,len);}}~UdpServer(){}private:int sockfd_;//网络文件描述符uint16_t port_;//端口号std::string ip_;//ip号bool isrunning;
};

可以使用netstat -naup查看是否启动成功。

在这里插入图片描述

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

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

相关文章

React16源码: React中context-stack的源码实现

context-stack 1 ) 概述 在 context 内部有一个概念是 stack 有一个唯一的stack里面保存各种各样的东西 stack的特性 在更新节点的时候&#xff0c;会把相关的信息入栈 在因为stack就是栈&#xff0c;在里面会存储各种各样的信息在更新节点的时候&#xff0c;每一个节点的信息…

可曾听闻Nginx?

目录 一.简介 二.Nginx的优点 三.反向代理 四.负载均衡 五.动静分离 六.总结 说起Nginx&#xff0c;耳边好像经常听到&#xff0c;但是不知道用来干嘛的。最近用到了&#xff0c;所以我就大概总结了基本知识&#xff0c;它经常与一个词出现在一起——反向代理。那接下来…

配置华为交换机环路检测案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE…

YOLOv5可视化热力图 | 支持自定义模型、置信度选择等功能(论文必备)

一、本文介绍 本文给大家带来的机制是的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv5最新版本,同时支持视频讲解,本文的内容是根据检测头的输出内容,然后来绘图。 在开始之前给大家推荐一下我的专栏,本专…

Vue服务器端渲染(SSR)是不是技术的倒退?

一、什么是服务器端渲染&#xff0c;是不是技术退步&#xff1f; Vue服务器端渲染&#xff08;Vue Server-Side Rendering&#xff0c;简称SSR&#xff09;是一种将Vue组件在服务器端进行渲染&#xff0c;生成最终的HTML页面&#xff0c;然后将其发送给客户端的技术。 传统的V…

烧录软件(Renesas Flash Programmer)瑞萨RL78G12系列单片机下载工具(E2)的软件配置与硬件链接说明

一、单片机与仿真器连接 E1引脚接线图 RL78系列单片机的GND接仿真器的pin2、pin12、pin14 RL78系列单片机的VDD接仿真器的pin8 RL78系列单片机的Tool0接仿真器的pin5 RL78系列单片机的Reset接仿真器的pin10、pin13 二、确认接线完成后&#xff0c;开始烧录 1、打开RFPV软件…

C 练习实例50-使用Dev-C++创建项目(圆形体体积计算器)

项目展示 项目案例&#xff1a;圆形体体积计算器 vol.h文件 #include <stdio.h> #include <math.h> #define PI 3.141592654 void cal(int sel); //函数声明 double vol_ball(void); double vol_cylind(void); double vol_cone(void); main.c文件 #include &quo…

【RT-DETR有效改进】手把手带你调参RT-DETR,复现官方版本实验环境

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文是带大家进行调参,利用ultralytics仓库1:1复现RT-DETR官方实验环境,从而在后期发表论文 的时候省去一些不必要的麻烦,例如被审稿人提出质疑,本文的调参内容均有依据,根据RT-DETR官方Github上发布的版…

【数字通信】数字带通传输

数字调制和数字带通传输系统 数字调制解调 数字调制 用数字基带信号控制载波&#xff0c;把数字基带信号变换为数字带通信号的过程 目的&#xff1a;数字基带信号含大量低频分量&#xff0c;无法通过具有带通特性的信道传输。需对数字基带信号进行数字调制使信号与信道的特…

网际协议 IP、IP地址

目录 网际协议 IP 虚拟互连网络 使用中间设备进行互连 IP 地址 IP 地址及其表示方法 ​编辑 IP 地址采用 2 级结构 IP 地址的编址方法 分类的 IP 地址 各类 IP 地址的指派范围 一般不使用的特殊的 IP 地址 IPv4网络中的地址类型 分类的 IP 地址的优点和缺点 划分子网…

《zdppy_aocrud官方教程》 02 自动生成根据ID查询接口

02 自动生成根据ID查询接口 《zdppy_aocrud官方教程》 02 自动生成根据ID查询接口 自动生成根据ID查询用户的方法 服务端 import aocrud import env import orm from api import Api, respenv.load("../.env")db, BaseModel orm.get_mysql_pool_base_model_by_e…

数字媒体技术基础之:声波及其测量

声音始于空气中的振动&#xff0c;如吉他弦、人的声带或扬声器纸盆产生的振动。 这些振动一起推动邻近的空气分子&#xff0c;从而轻微增加空气压力。 压力下的空气分子随后推动周围的空气分子&#xff0c;后者又推动下一组分子&#xff0c;依此类推。 高压区域穿过空气时&…

链表中倒数第k个结点

题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 这道题首先按照普通的方法用一个栈来存放链表数据然后在取出第k的数就可以了,但是这种方法的时间复杂度是O(n),不提倡; 现在我介绍一种时间复杂度为O(n-k)的方法,老规矩-->先贴源码,在分析: /*public clas…

appsmith安装手记:3.appsmith安装

终于到了安装appsmith这个大神的时候&#xff0c;这个简单&#xff0c;真是越到后面越容易。 安装说明见&#xff1a;https://docs.appsmith.com/getting-started/setup/installation-guides/docker &#xff0c;建议使用 Docker Compose 进行长期的 Appsmith 部署 步骤一&…

SpringSecurity笔记

SpringSecurity 本笔记来自三更草堂&#xff1a;https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click&#xff0c;仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;…

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路&#xff1a; 解法二&#xff1a;生产者-消费者解法 1.把 hydrogen 线程看作生产者&#xff0c;oxygen 线程看作消费者&#xff0c;缓冲队列大小为2。 2.hydrogen 把生成的氢放入队列&#xff1b;oxygen 线程每次从队列里消费两个氢元素。 3.生产者生产两个氢元素后会因为…

Selenium解决滑块验证问题:自动化与技巧

滑块验证是一种常见的人机验证机制&#xff0c;用于识别和防止自动化程序的访问。在爬虫和自动化测试中&#xff0c;我们经常面临需要处理滑块验证的情况。本文将介绍如何使用 Selenium 库处理滑块验证问题。 一、安装 Selenium 首先&#xff0c;确保你已经安装了 Selenium。你…

【极数系列】Linux环境搭建Flink1.18版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

[go] 享元模式

享元模式 是一种结构型设计模式&#xff0c; 它摒弃了在每个对象中保存所有数据的方式&#xff0c; 通过共享多个对象所共有的相同状态&#xff0c; 让你能在有限的内存容量中载入更多对象。 模型说明 享元模式只是一种优化。在应用该模式之前&#xff0c;你要确定程序中存在…

二叉树--199. 二叉树的右视图/medium 理解度C

199. 二叉树的右视图 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出…