day34- 系统编程之 网络编程(TCP)

news2025/6/6 23:42:59

一、补充

ip地址:除了本机地址如:192.168.0.151还可以使用(自己测试)本地回环地址(127.0.0.1)或者使用htonl(INADDR_ANY);

二、模式  C/S 模式 ->服务器/客户端模型:TCP传输控制协议

2.1 C/S与B/S简要介绍及区别:

        什么是P2P?

         P2P(Peer-to-Peer)网络是一种分布式网络架构,其中每个节点(或称为“对等体”)都是网络的参与者,节点之间直接进行数据交换与通信

 

TCP通信特性:

  1. 有链接,
  2. 可靠传输方式
  • 应答机制
  • 超时重传
  • 全双工
  • 连续,无边界
  • 有顺序

三次握手:(握手触发在accept()和connect()函数之间,断开出现在双方调close());

UDP称为用户报

TCP称为流式套接字 

注意:内容是有顺序的

2.2 编程 

server:socket()-->bind()--->listen()-->accept()-->recv()-->close()
client:socket()-->connect()-->send()-->close();

2.2.1 服务端

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

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET == AF_INET ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
           type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
                SOCK_DGRAM   用户数据报套接字===>UDP
                SOCK_RAW     原始套接字  ===》IP
            protocol 协议 ==》0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id, 失败  -1;

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

功能:如果该函数在服务器端调用,则表示将参数1相关 的文件描述符文件与参数2 指定的接口地址关联, 用于从该接口接受数据。

      如果该函数在客户端调用,则表示要将数据从 参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族
          u_short           sin_port;   ///地址端口
          struct in_addr  sin_addr;   ///地址IP
          char               sin_zero[8]; 占位
      };

      struct in_addr
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功 0,失败  -1;

int listen(int sockfd, int backlog);

    功能:在参数1所在的套接字id上监听等待链接。
    参数:sockfd  套接字id
               backlog 允许链接的个数。
    返回值:成功  0,失败  -1;

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

   功能:从已经监听到的队列中取出有效的客户端链接并接入到当前程序。
   参数:sockfd 套接字id
              addr  如果该值为NULL ,表示不论客户端是谁都接入。
                如果要获取客户端信息,则事先定义变量并传入变量地址,函数执行完毕将会将客户端信息存储到该变量中。
              addrlen: 参数2的长度,如果参数2为NULL,则该值也为NULL;如果参数不是NULL,&len; 一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;从该代码之后所有通信都基于该id

                 失败  -1;

ssize_t recv(int sockfd, void *buf, size_t len,
             int flags);

功能:从指定的sockfd套接字中以flags方式获取长度
      为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或者
      动态内存。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len,失败  -1;

int send(int sockfd, const void *msg, 
        size_t len, int flags);

  功能:从msg所在的内存中获取长度为len的数据以flags
            方式写入到sockfd对应的套接字中。

   参数:sockfd:
                       如果是服务器则是accept的返回值新fd
                       如果是客户端则是sockfd的返回值旧fd

              msg 要发送的消息
              len 要发送的消息长度
              flags 消息的发送方式。

  返回值:成功  发送的字符长度,失败  -1;

 2.2.2 客户端

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

   功能:该函数固定有客户端使用,表示从当前主机向目标
            主机发起链接请求。
   参数:sockfd 本地socket创建的套接子id
              addr 远程目标主机的地址信息。
              addrlen: 参数2的长度。
   返回值:成功 0,失败 -1;

int send(int sockfd, const void *msg, 
        size_t len, int flags);

   功能:从msg所在的内存中获取长度为len的数据以flags
            方式写入到sockfd对应的套接字中。

   参数:sockfd:
               如果是服务器则是accept的返回值新fd
            如果是客户端则是sockfd的返回值旧fd

         msg 要发送的消息
         len 要发送的消息长度
         flags 消息的发送方式。

  返回值:成功  发送的字符长度,失败  -1;

 2.3 TCP的粘包问题

        双方发送时,中间缺少一些约定,导致数据拆开出现问题,即数据之间没有边界;

解决方法:

1.设置分隔标志

2.固定大小(struct结构体) 

3.自定义协议


获取文件大小函数:stat函数

int stat(const char *pathname, struct stat *statbuf);

 

写入,判断返回值,避免路径出错 


 telnet/ssh2远程登陆工具

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

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

相关文章

鸿蒙jsonToArkTS_工具exe版本来了

前言导读 相信大家在学习鸿蒙开发过程中最痛苦的就是编写model 类 特别是那种复杂的json的时候对不对, 这时候有一个自动化的工具给你生成model是不是很开心。我们今天要分享的就是这个工具 JsonToArkTs 的用法 工具地址 https://gitee.com/qiuyu123/jsontomodel…

DeviceNet转Modbus TCP网关的远程遥控接收端连接研究

在港口码头作业中,遥控器因其精确的操作控制和稳定的性能,已成为起重机货物装卸作业的重要辅助工具。然而,在某港口码头实施无线遥控器远程控制掘进机的过程中,由于通信协议的不兼容,遭遇了技术难题。具体而言&#xf…

ASP.NET Core 中间件深度解析:构建灵活高效的请求处理管道

在现代Web应用开发中,请求处理管道的设计和实现至关重要。ASP.NET Core通过其中间件(Middleware)系统提供了一种高度灵活、可扩展的方式来构建请求处理管道。本文将全面深入地探讨ASP.NET Core中间件的概念、工作原理、实现方式以及最佳实践,帮助开发者掌…

从0到1认识ElasticStack

一、ES集群部署 操作系统Ubuntu22.04LTS/主机名IP地址主机配置elk9110.0.0.91/244Core8GB100GB磁盘elk9210.0.0.92/244Core8GB100GB磁盘elk9310.0.0.93/244Core8GB100GB磁盘 1. 什么是ElasticStack? # 官网 https://www.elastic.co/ ElasticStack早期名称为elk。 elk分别…

I2C 外设知识体系:从基础到 STM32 硬件实现

文章目录 I2C外设简介I2C 通信实现方式对比1. 软件模拟 I2C2. 硬件实现 I2C STM32 I2C 外设核心功能1. 硬件特性2. 寄存器与引脚 I2C框图一、引脚接口二、数据处理模块三、时钟控制模块四、控制逻辑模块五、辅助功能 I2C基本结构主机发送一、7 位主发送序列二、10 位主发送序列…

文件索引:数组、二叉树、二叉排序树、平衡树、红黑树、B树、B+树

参考链接:https://www.bilibili.com/video/BV1mY4y1W7pS 数据结构可视化工具:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 问题引出:一般是什么原因导致从磁盘查找数据效率低? 通过索引来更快的查询数据&a…

《仿盒马》app开发技术分享-- 商品搜索页(顶部搜索bar热门搜索)(端云一体)

开发准备 随着开发功能的逐渐深入,我们的应用逐渐趋于完善,现在我们需要继续在首页给没有使用按钮以及组件添加对应的功能,这一节我们要实现的功能是商品搜索页面,这个页面我们从上到下开始实现功能,首先就是一个搜索…

Tensorborad

一、tensorboard的基本操作 1.1 发展历史 TensorBoard 是 TensorFlow 生态中的官方可视化工具(也可无缝集成 PyTorch),用于实时监控训练过程、可视化模型结构、分析数据分布、对比实验结果等。它通过网页端交互界面,将枯燥的训练…

工业自动化DeviceNET从站转Ethernet/IP主站网关赋能冶金行业工业机器人高效运行

在冶金行业高速发展的当下,对生产效率与精度的要求不断攀升。工业机器人凭借其精准、高效的特性,在钻孔、铣削、切割、弯曲、冲压等加工工艺中广泛应用。然而,不同设备间的通信协议差异常成为制约系统协同的瓶颈。JH-DVN-EIP疆鸿智能DeviceNE…

开源数据库MySQL 与 PostgreSQL的巅峰对决。

MySQL 与 PostgreSQL 是两大主流开源关系型数据库,其核心差异主要体现在架构设计、功能特性、性能优化及适用场景上。结合最新技术对比和行业实践,以下为深度解析: 🧠 ​​一、架构与设计哲学​​ ​​维度​​​​PostgreSQL​​…

从 LeetCode 到日志匹配:一行 Swift 实现规则识别

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在开发中我们经常遇到“模式匹配”的问题,比如日志分类、用户意图识别、甚至是在一些权限系统中做规则映射判断。这类问题的本质是判断两个结构是否具有一致的对应关系。LeetCo…

前端js获取当前经纬度(H5/pc/mac/window都可用)

前端JS获取当前位置的经纬度&#xff08;H5/PC/mac/window都可用&#xff0c;亲测&#xff01;&#xff09;&#xff0c;效果如下。 完整代码如下&#xff1a; <!-- 用原生api获取经纬度&#xff0c;转化为百度经纬度与服务端交互&#xff0c; 只支持https&#xff01; --&g…

Meta计划借助AI实现广告创作全自动化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

AI编程规范失控?三大策略用Cursor Rules精准约束

​在 AI 编程时代,如何让助手精准理解您的项目规范?当团队协作时,如何确保每位开发者生成的代码风格统一?Cursor Rules 正是您需要的终极解决方案——它如同一位永不疲倦的架构师,通过预设规则控制 AI 的每一次代码生成、重构与补全行为。 本教程将带您深入 Cursor Rules…

4.大语言模型预备数学知识

大语言模型预备数学知识 复习一下在大语言模型中用到的矩阵和向量的运算&#xff0c;及概率统计和神经网络中常用概念。 矩阵的运算 矩阵 矩阵加减法 条件&#xff1a;行数列数相同的矩阵才能做矩阵加减法 数值与矩阵的乘除法 矩阵乘法 条件&#xff1a;矩阵A的列数 矩阵…

免费开源Umi-OCR,离线使用,批量精准!

Umi-OCR&#xff08;Windows端&#xff09; Umi-OCR 是一款在 GitHub 上开源的免费 OCR 识别软件&#xff0c;它最大的亮点就是免费、开源、支持批量处理&#xff0c;而且识别准确度很高。这款软件不需要联网就能用&#xff0c;非常值得推荐&#xff01; 在 OCR 识别功能方面&…

NLP驱动网页数据分类与抽取实战

一、性能瓶颈点&#xff1a;数据抽取中的「三座大山」 在使用NLP技术进行网页商品数据抽取时&#xff0c;很多工程师会遇到如下三类瓶颈&#xff1a; 1. 请求延迟高&#xff1a;目标站点反爬机制灵敏&#xff0c;普通请求频繁被封。2. 结构解析慢&#xff1a;HTML结构复杂&am…

阿里云ACP云计算备考笔记 (3)——云存储RDS

目录 第一章 云存储概览 1、云存储通用知识 ① 发展历史 ② 云存储的优势 2、云存储分类 3、文件存储业务场景 第二章 块存储 1、块存储分类 2、云盘的优势 3、创建云盘 4、管理数据盘 ① 格式化数据盘 ② 挂载数据盘 ③ 通过 API 挂载云盘 5、管理系统盘 ① 更…

仓颉语言---Socket编程

一、什么是Socket编程&#xff1f; 1.定义 Socket&#xff08;套接字&#xff09;可以被理解为网络上两个进程之间通信的端点。它是网络通信的抽象表示&#xff0c;封装了底层网络协议的复杂性&#xff0c;为应用程序提供了一个简单统一的接口。 Socket 编程是一种网络编程范式…

【Java EE初阶 --- 多线程(初阶)】多线程的实现案例

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 前言单例模式实现单例模式…