笔记整理—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;//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)
    {
        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等等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战 | 国外攻破大学数据库系统,暴露数千学生记录

实战 | 国外攻破大学数据库系统,暴露数千学生记录 引言 在这篇文章中,我将分享我是如何攻破一个大型大学解决方案门户服务器的,这个服务器服务于许多大学客户,并且涉及数千名学生的数据。 目标 这是一个由印度许多大学和学院使…

没有基础,学习HCIE难吗?

首先要清楚,华为 HCIE-Datacom 认证并非局限于特定专业背景,即便对专业基础有一定要求,无论你有无相关学习经历或者工作经验,皆有机会报考并争取通过这一认证。HCIE-Datacom 考试主要由笔试和实验两部分构成,涉及高级路…

elf加载,动态库加载

elf加载 ELF(Executable and Linkable Format,可执行与可链接格。 所以我们写代码生成的可执行文件,以及写的动态库都是elf格式的文件。 我们重点要关注的就是红色框框里面的section节。 而节保存的就有我们的代码段和数据段。所以我们链接…

Redis 性能优化选择:Pika 的配置与使用详解

引言 在我们日常开发中 redis是我们开发业务场景中不可缺少的部分。Redis 凭借其内存存储和快速响应的特点,广泛应用于缓存、消息队列等各种业务场景。然而,随着数据量的不断增长,单节点的 Redis 因为内存限制和并发能力的局限,逐…

ONLYOFFICE文档8.2:开启无缝PDF协作

ONLYOFFICE 开源办公套件的最新版本新增约30个新功能,并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器,支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作,支持插件和 AI 集…

论文解读 | ECCV2024 AutoEval-Video:一个用于评估大型视觉-语言模型在开放式视频问答中的自动基准测试...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 陈修元,上海交通大学清源研究院硕士生 概述 总结来说,我们提出了一个新颖且具有挑战性的基准测试AutoEvalVideo,用于全…

红队-安全见闻篇(上)

声明 学习视频来自B站UP主 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.编程与开发 1.后端语言学习 C语⾔:⼀种通⽤的…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理的高效解决方案

在当今的数字化安防时代,视频监控系统的需求日益复杂和多样化。为了满足不同场景下的监控需求,一种高效、灵活且兼容性强的安防视频监控平台——NVR批量管理软件/平台EasyNVR应运而生。本篇探讨这一融合所带来的创新与发展。 一、NVR监测软件/设备EasyNV…

053_python基于深度学习的短视频内容理解与推荐系统

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

如何实现海内外工厂的EDI对接?

企业在国际市场的扩张需要高效的信息流动,以便快速响应客户需求。但国内工厂和海外工厂使用的系统可能存在兼容性问题,且数据格式各不相同,集成过程复杂。 近期国内主营高精度滚动轴承的汽车行业C公司就遇到了这样的挑战,如何实现…

linux查看文件命令

查看文件命令 显示命令 cat 语法:cat 【选项】 文件 选项 命令含义n显示行号包括空行b显示行号不包括空行s压缩空行为一行A显示隐藏字符 cat -n 文件:显示行号包括空行 cat -b 文件 cat -s 文件 cat -A 文件 more和less是 分页查看 tac和rev都…

python实战项目47:Selenium采集百度股市通数据

python实战项目47:Selenium采集百度股市通数据 一、思路分析二、完整代码一、思路分析 这里以获取百度股市通股评下的投票数据为例,页面中的其他数据同理。由于此页面数据是js动态加载的,所以采用Selenium获取数据。思路很简单,通过Selenium打开页面,然后定位到“股评”选…

502 错误码通常出现在什么场景?

服务器过载场景 高流量访问:当网站遇到突发的高流量情况,如热门产品促销活动、新闻热点事件导致网站访问量激增时,服务器可能会因承受过多请求而无法及时响应。例如,电商平台在 “双十一” 等购物节期间,大量用户同时…

Java 多线程(七)—— 定时器

定时器介绍与使用 先简单介绍一下什么是定时器:定时器类似生活中的闹钟,当时间一到,我们就会去做某些事情。 在代码层面理解就是,当我们设置的时间一到,程序就会执行我们固定的代码片段(也就是任务&#x…

Nacos-Sync-未授权进后台(建议自查)

Nacos-Sync-未授权进后台(建议自查) 漏洞成因 没进行权限校验。 影响范围 Nacos-Sync 3.0 发现方式 一、fofa发现 title“nacos” && title“Nacos-Sync” 二、路径拼接 /#/serviceSync 利用方式 访问之后直接是进入后台的样子~ 修复方…

【AI视频抠图整合包及教程】开启视觉分割新纪元 —— Meta SAM 2

在数字化时代,Meta公司推出的SAM 2(Segment Anything Model 2)标志着图像和视频分割技术的一个新高度。SAM 2不仅继承了前代SAM模型的卓越性能,更在实时处理、视频分割、交互式提示等方面实现了重大突破。以下是SAM 2的全面营销文…

【植物识别系统】Python+人工智能+深度学习+卷积神经网络算法+TensorFlow+算法模型+Django网页界面平台

一、介绍 植物识别系统,使用Python作为主要编程语言开发,通过收集常见的6中植物树叶(‘广玉兰’, ‘杜鹃’, ‘梧桐’, ‘樟叶’, ‘芭蕉’, ‘银杏’)图片作为数据集,然后使用TensorFlow搭建ResNet50算法网络模型&am…

如何通过Lua语言请求接口拿到数据

文章目录 概要http客户端通过请求下载数据 概要 当某个需求是需要在模块内请求接口拿到数据,需要使用http客户端调用接口 http客户端 LuaSOC请求接口官方文档 调用:http.request(method,url,headers,body,opts,ca_file,client_ca, client_key, clien…

【日记】感觉沟通是件很难精通的事情(1397 字)

正文 今天霜降,感觉得开始戴手套了,去年就是因为戴得早,所以避免了生冻疮。不知道今年还会不会有这么幸运。虽然霜降,但意外地天气很好呢。下午又找了个时间稍微偷溜出去发了一会儿呆。可惜每次下班天都黑了,天气好的话…

HCIP--1

同一区域内的OSPF路由器拥有一致的 LSDB, 在区域内,OSPF 采用 SPF算法计算路由一个区域太多路由器,硬件资源跟不上,所以多划分区域 OSPF 路由计算原理 1. 区域内路由计算 LSA 在OSPF中,每个路由器生成 LSA,用于告诉…