笔记整理—linux网络部分(3)socket接口

        首先,send()函数和write()可以用于发送,而recv()和read()k可用于接收文件,其本质就是因为linux中,一切皆是文件。

int socket(int domain, int type, int protocol);

        domain是指域,是ipv4还是ipv6;type是socket类型(SOCK_STREAM->TCP);protocol是指协议。

        看机构很像open函数,用于打开一个网络连接,成功则返回一个网络文件描述符。

int bind(int socket, const struct sockaddr *address,socklen_t address_len);

        const struct sockaddr *address是通信地址与端口,其不对IPV4/6区分;socklen_t address_len是指addr大小。

int listen(int socket, int backlog);

        backlog是监听队列的长度。

int connect(int socket, const struct sockaddr *address,socklen_t address_len);

        const struct sockaddr *address要连接谁。

ssize_t send(int socket, const void *buffer, size_t length, int flags);
ssize_t recv(int socket, void *buffer, size_t length, int flags);

        不难发现,这两个函数比write多一个参数flags。flags本质是看使用的协议支持不支持flags的使用。

辅助地址转化函数:点分十进制与32位字符串进行转换int inet_aton(const char *cp, struct in_addr *inp);in_addr_t inet_addr(const char *cp);char *inet_ntoa(struct in_addr in);//上面这些是老的IPV4接口const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);int inet_pton(int af, const char *src, void *dst);
这是新的ipv4/6接口

        ntop是将32转为点分十进制;pton将点分十进制转为32字符串进行转换。

        struct socketaddr 在linux中用来表示IP地址的标准结构体(IPV4/6实际上用struct sockaddr_in这是V4,sockaddr_in6是V6的填充)。

        typedef uint32_t in_addr_t是网络用于表示IP地址的类型;struct in_addr封装了in_addr_t s_addr。

设IPADDR "192.168.1.102"in_addr_t addr=0;
addr=inet_addr(IPADDR)=0X66 01 a8 c0;翻译为点分十进制就是102 1 168 192 这是大小端的问题,反过来看就对了

        大小端在网络传输中是具有危害的,为了修复这个问题就产生了网络字节区(大端模式)。

inet_pton(AF_INEF,IPADDR,&addr);
AF_INEF表示使用了IPV4
addr是struct in_adr addr,addr.s_addr=0x6601a8c0
ret=inet_ntop(AF_INET,&addr,buf,sizeof(buf));

        端口号实际上就是一个数字编号,用于在一台电脑OS中唯一辨识一个能够上网的进程。端口号会被打包进入数据进行传输,目标包是IP+端口号做传输标识。

        服务器部分

int main()
{#define SERADDR "xxx.xxx.xxx.xxx"int sockfd=-1;sockfd=socket(AF_INET,SOCK_STREAM,0);//ipv4,TCP,默认协议if(-1==sockfd){perror("socket");//错误检测}struct sockaddr_in seraddr={0};seraddr.sin_family=AF_INET;//IPV4seraddr.sin_port=htons(6003);//端口号,主机转网络专用seraddr.sin_addr.s_addr=inet_addr(SERADDR);//点分十进制转网络16进制(大端),设置IPret=bind(sockfd,(const struct sockaddr *)&seraddr,sizeof(seraddr));if(-1==ret){perror("bind");//错误检测return -1;}#define BACKLOG 100;//队列长度ret=listen(sockfd,BACKLOG);//监听if(-1==ret){perror("listen");//错误检测return -1;}struct sockaddr_in cliaddr={0};clifd=accept(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr))//accept等待客户端连接                处于监听阻塞状态;//(struct sockaddr *)&cliaddr获取到客户端IP;clifd返回连接成功的客户端申请fd
}

        客户端部分

客户端部分
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==sockfd)//错误检查
{error("sockfd");//错误检测return -1;
}
seraddr.sin_family=AF_INET;//IPV4
seraddr.sin_port=htons(6003);//端口号,主机转网络专用
seraddr.sin_addr.s_addr=inet_addr(SERADDR);//点分十进制转网络16进制(大端),设置IP
ret=bind(sockfd,(const struct sockaddr *)&seraddr,sizeof(seraddr));
if(-1==ret){error("bind");//错误检测return -1;}

        connect成功后server端的accept不再阻塞,返回值为一个fd,会为这个连接新申请一个关于这个连接的fd,进行读写操作。

        socket返回的fd为监听描述符,用于监听客户端,不能用于和任何客户端进行读写,accept返回的为连接上的客户端fd。

        cliebt发送:

        在建立连接后就可发送与接收。

char sendbuf[100]={0};
strcopy(sendbuf,"xxx");
ret=send(sockfd,sendbuf,strlen(sendbuf),0);

        server接收

ret=recv(clifd,recvbuf,sizeof(sendbuf),0);
ret为成功接收的个数;clifd连接客户端的fd;recvbuf为接收到的字符;0为flag,默认为0

        client多次发送

while(1)
{scanf("%s",sendbuf);ret=send(sockfd,sendbuf,strlen(sendbuf),0);
}

        server多次接收

while(1)
{ret=recv(clifd,recvbuf,sizeof(recvbuf),0);memset(recvbuf,0,sizeof(recvbuf));//清理一下接收部分
}

        bind:Address already in use 地址被占用看,原因异常中断关闭程序。修改方式等下一次运行;或者改一下端口号。

        recv收消息,send发送消息。

        原则上c/s是要做配合的,cli发送ser收,ser发cli收。①c/s是异步的,不知道下一步是发送还是接收。②方案依靠应用协议,双方做通信约定。

        自定义协议:①规定link后主动向ser发出一个包,ser回应cli一个数据包,完成一次通信回合。②整个通信就由n个这样的回合完成。

        ser:

{①服务器接收ret=recv(......);memset(......);②解析发出的数据包,开始③干完活恢复客户端ret=send(clifd,"ok",2,0);//完成一个回合
}

        cli:

{①客户端发送ret=send(......);②客户端收服务器回答memset(......);ret=recv(......);//完成一个回合
}

        自定义数据包格式:

struct commu{char name[20];int age;int cmd;
}info;cli:
info st1;
①填充info
②发送info
ret=send(sockfd,&st1,sizeof(st1),0);
③等待ser回应
ret=recv(sockfd,......);ser:
info st;
①收服务端发送消息
ret=recv(clifd,&st,sizeof(info),0);
②解析,干活
......
③回应客户端
ret=send(clifd,"ok",2,0);

        常用应用层协议http,ftp等等。

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

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

相关文章

Prompt-Tuning方法学习

文章目录 一、背景1.1 Pre-training1.2 Fine-Tuning1.3 高效微调(SOTA PEFT)1.4 基于强化学习的进阶微调方法(RLHF) 二、Prompt-Tuning技术2.1 发展历程2.2 Prompt模板构建方式 三、基于连续提示的Prompt Tuning四、Q&A 一、背…

程序员节日的日期是10月24日‌程序员日

‌程序员节日的日期是10月24日。‌ 这一天被称为‌中国程序员日或‌1024程序员节,由‌博客园、‌CSDN等自发组织设立,旨在纪念程序员对科技世界的贡献。 程序员节日的由来和意义 1024程序员节的由来可以追溯到2010年,最初由网友提出设立一个…

如何制作一个自己的网站?

在今天的互联网时代,网站展示已经是一个很基础的营销工具。不管是企业、还是个人,如何制作一个自己的网站?本文将会提供一个全面的基础制作网页教程,教你如何从零开始制作网页。 网页制作的基础知识:HTML、CSS和JavaS…

RocketMQ消息处理详解!

文章目录 引言同步发送原理分析优缺点优点缺点 使用场景 异步发送原理分析优缺点优点缺点使用场景 单向发送原理分析优缺点优点缺点 使用场景 三种方式对比如何选择同步发送异步发送单向发送 总结 引言 在 RocketMQ 中,有 3种简单的消息发送方式:同步发…

R语言绘图——坐标轴及图例

掌握坐标轴与图例的设置与调整,对于提升数据可视化的清晰度和可读性至关重要。通过这些工具,可以有效地传达数据背后的故事,提高图表的表现力。 0x01 坐标轴 一、坐标轴的设置 1、修改坐标轴的标签 在ggplot2中,坐标轴是根据数…

计算服务器:开启科学计算新变革的强大引擎

1983 年,著名数学家 Lax 为首的调研小组指出,大型科学计算对国家安全、科技进步与经济发展至关重要,从美国国家利益出发,大型计算的绝对优势不容动摇。 科学计算是什么?为何在 20 世纪 80 年代就被提升到美国国家利益层…

Pytest日志收集器配置

前言 在pytest框架中,日志记录(logging)是一个强大的功能,它允许我们在测试期间记录信息、警告、错误等,从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成,因此你可以很容易地在…

vmware虚拟机linux系统安装

一、下载linux镜像安装包 步骤1---网址地址下载镜像 地址:Index of /ubuntu-releases/22.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 步骤2---下载linux版本号 步骤3---查看下载的linuxiso linux镜像操作系统 二、vmware新建安装linux操作系统…

边缘计算技术的优势与挑战

如今,随着5G快速无线网络的到来,将计算存储和物联网(IoT)分析的部署放在靠近数据产生的地方,使得边缘计算成为可能。 物联网设备和新应用的扩展需要实时计算能力。5G无线正在考虑边缘系统,以快速跟踪支持实…

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

爬虫中代理ip选择和使用实战

一、爬虫中的反爬问题 爬虫技术不仅是一种工具,更像是一门捕捉信息的艺术。通过它,我们能够从浩瀚的互联网中,精确获取到所需的有价值数据。对于那些需要进行数据分析或模型训练的人来说,爬虫技术几乎是必备的技能。虽然网上公开…

MyBatis 如何映射 Enum(使用 EnumTypeHandler、自定义 TypeHandler)

文章目录 1. MyBatis 中的 Enum 映射概述2. 使用 EnumTypeHandler2.1 代码示例:将 Enum 映射为字符串2.2 代码示例:将 Enum 映射为整数2.3 如何配置 EnumTypeHandler 3. 自定义 TypeHandler3.1 为什么需要自定义 TypeHandler3.2 自定义 TypeHandler 的实…

git提交到github个人记录

windows下git下载 1.进入git官网https://git-scm.com/downloads/win 一直默认选项即可 2.在settings中SSH and GPG keys中Add SSH key 3.选择git cmd git使用 1.配置用户名,和邮箱 git config --global user.email "youexample.com" git config --g…

深入探索路由算法的核心原理与应用

文章目录 引言一、路由算法的分类1.1 静态路由算法1.1.1 原理1.1.2 如何配置静态路由 1.2 动态路由算法 二、距离矢量路由算法2.1 原理2.2 举例 三、链路状态路由算法3.1 原理3.2 举例 四、现代路由算法的发展4.1 BGP(边界网关协议)4.2 MPLS(…

Director3D: Real-world Camera Trajectory and 3DScene Generation from Text 论文解读

目录 一、概述 二、相关工作 1、文本到3D生成 2、3DGS 三、Director3D 1、Cinematographer 2、Decorator 3、Detailer 4、Loss 一、概述 该论文提出利用真实世界数据集,设计一个从文本生成真实世界3D场景和自适应相机轨迹的强大的开放世界文本到3D生成框架…

【MySQL数据库】MySQL主从复制

文章目录 MySQL主从复制MySQL主从复制的分类MySQL主从复制原理MySQL主从复制的配置步骤MySQL主从复制的同步模式 MySQL主从复制实验环境准备关闭防火墙和 SELinux时间同步主服务器设置从服务器设置 MySQL 主从复制配置主服务器配置从服务器配置(以 Slave1 为例&…

Centos 7使用yum提示无法解析主机:mirrorlist.centos.org

目录 1.问题: 2.原因 3.解决方案: 1)切换到Vault 2)第二种改为阿里云 1.问题: yum源无法使用 2.原因 从2024年7月1日起,在CentOS7上,请切换到Vault存档存储库 3.解决方案: 1)切换到Vault vi /etc/yum.repos.d/CentOS-Base.repo [base] nameCentOS-$releasever - Bas…

从 0 开发一个系统

一、需求分析 明确系统的目标和用途:确定系统要解决的问题是什么,为哪些用户提供服务,以及期望达到的效果。收集用户需求:与潜在用户、利益相关者进行沟通,了解他们的需求和期望,包括功能需求、性能需求、用…

067_基于springboot的HSK学习平台

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

【进阶OpenCV】 (18)-- Dlib库 --人脸关键点定位

文章目录 人脸关键点定位一、作用二、原理三、代码实现1. 构造人脸检测器2. 载入模型(加载预测器)3. 获取关键点4. 显示图像5. 完整代码 总结 人脸关键点定位 在dlib库中,有shape_predictor_68_face_landmarks.dat预测器,这是一个…