当前位置: 首页 > article >正文

C++.IP协议通信

C++IP协议通信

  • 1. TCP协议通信
    • 1.1 服务端实现
      • 创建套接字
      • 绑定地址
      • 监听连接
      • 接受连接
      • 数据传输
      • 关闭连接
    • 1.2 客户端实现
      • 创建套接字
      • 连接服务器
      • 数据传输
      • 关闭连接
    • 1.3 示例代码
      • 服务端代码示例
      • 客户端代码示例
      • 绑定地址
      • 接收数据
      • 发送数据
      • 关闭套接字
    • 2.2 客户端实现
      • 创建套接字
      • 发送数据
      • 接收数据
      • 关闭套接字
    • 2.3 示例代码
      • 服务端代码示例
      • 客户端代码示例
      • 发送POST请求
      • 示例代码说明
    • 4.1 基本原理
    • 4.2 示例代码
      • FTP文件下载
      • FTP文件上传
      • 示例代码说明
    • 5.1 基本原理
    • 5.2 示例代码
      • 发送邮件示例代码
      • 示例代码说明
    • 6.1 基本原理
    • 6.2 示例代码
      • 连接POP3服务器并登录
      • 检索邮件列表
      • 下载邮件内容
      • 示例代码说明
    • 7.1 介绍了TCP和UDP协议的基本通信流程和示例代码
    • 7.2 介绍了HTTP、FTP、SMTP和POP3等应用层协议的原理和C++实现方法
    • 7.3 强调了协议在通信中的重要性以及C++在网络编程中的应用

1. TCP协议通信

1.1 服务端实现

创建套接字

使用socket(AF_INET, SOCK_STREAM, 0)创建TCP套接字。其中,AF_INET表示使用IPv4协议族,SOCK_STREAM表示使用TCP协议,0表示让系统自动选择默认的协议。

int listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);
}

绑定地址

通过bind将套接字绑定到本地地址和端口。绑定时需要指定本地的IP地址和端口号,通常使用INADDR_ANY表示绑定到所有可用的网络接口。

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8080);if (bind(listenfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);
}

监听连接

调用listen函数开始监听客户端连接请求。listen函数的第二个参数backlog表示等待连接的队列长度,通常设置为SOMAXCONN

if (listen(listenfd, SOMAXCONN) == -1) {perror("listen failed");exit(EXIT_FAILURE);
}

接受连接

使用accept函数接受客户端连接,返回新的套接字用于通信。accept函数会阻塞,直到有客户端连接请求到达。

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_len);
if (clientfd == -1) {perror("accept failed");exit(EXIT_FAILURE);
}

数据传输

通过sendrecv函数与客户端进行数据交互。send函数用于向客户端发送数据,recv函数用于从客户端接收数据。

char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int bytes_received = recv(clientfd, buffer, sizeof(buffer), 0);
if (bytes_received > 0) {printf("Received data: %s\n", buffer);send(clientfd, buffer, bytes_received, 0);
} else {perror("recv failed");
}

关闭连接

通信结束后调用close关闭套接字。

close(clientfd);
close(listenfd);

1.2 客户端实现

创建套接字

使用socket(AF_INET, SOCK_STREAM, 0)创建TCP套接字。

int clientfd = socket(AF_INET, SOCK_STREAM, 0);
if (clientfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);
}

连接服务器

通过connect函数向服务器发起连接请求。需要指定服务器的IP地址和端口号。

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");if (connect(clientfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("connect failed");exit(EXIT_FAILURE);
}

数据传输

使用sendrecv函数与服务器进行数据交互。

char send_buffer[] = "Hello, Server!";
send(clientfd, send_buffer, strlen(send_buffer), 0);char recv_buffer[1024];
memset(recv_buffer, 0, sizeof(recv_buffer));
int bytes_received = recv(clientfd, recv_buffer, sizeof(recv_buffer), 0);
if (bytes_received > 0) {printf("Received data: %s\n", recv_buffer);
} else {perror("recv failed");
}

关闭连接

通信结束后调用close关闭套接字。

close(clientfd);

1.3 示例代码

服务端代码示例

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>using namespace std;int main() {int listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(8080);if (bind(listenfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);}if (listen(listenfd, SOMAXCONN) == -1) {perror("listen failed");exit(EXIT_FAILURE);}struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr);int clientfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_len);if (clientfd == -1) {perror("accept failed");exit(EXIT_FAILURE);}char buffer[1024];memset(buffer, 0, sizeof(buffer));int bytes_received = recv(clientfd, buffer, sizeof(buffer), 0);if (bytes_received > 0) {printf("Received data: %s\n", buffer);send(clientfd, buffer, bytes_received, 0);} else {perror("recv failed");}close(clientfd);close(listenfd);return 0;
}

客户端代码示例

#include <iostream>

相关文章:

C++.IP协议通信

C++IP协议通信 1. TCP协议通信1.1 服务端实现创建套接字绑定地址监听连接接受连接数据传输关闭连接1.2 客户端实现创建套接字连接服务器数据传输关闭连接1.3 示例代码服务端代码示例客户端代码示例绑定地址接收数据发送数据关闭套接字2.2 客户端实现创建套接字发送数据接收数据…...

css背景相关

背景书写 background: url(src); // 注意&#xff1a;在写动态样式时&#xff0c;backgournd赋值格式错误&#xff0c;是不会在浏览器dom的style上显示的 // 但是可以创建不可见的img&#xff0c;预加载来提高性能背景也会加载图片资源 同img的src一样&#xff0c;background也…...

PyCharm 加载不了 conda 虚拟环境,不存在的

#工作记录 前言 在开发过程中&#xff0c;PyCharm 无法加载 Conda 虚拟环境是常见问题。 在不同情况下&#xff0c;“Conda 可执行文件路径”的指定可能会发生变化&#xff0c;不会一尘不变&#xff0c;需要灵活处置。 以下是一系列解决此问题的经验参考。 检查 Conda 安装…...

设计模式学习整理

目录 UML类图 设计模式六大原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.开(放封)闭原则 设计模式分类 1.创建型模式 2.结构型模式 4.行为型模式 一、工厂模式(factory——简单工厂模式和抽象工厂模式) 1.1、…...

二分查找的理解

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int binary_search(int arr[], int k, int sz) {int left 0;int right sz - 1;//这个是下标&#xff0c;减一是因为在0开始的&#xff0c;怕越界&#xff08;访问无效&#xff09;while (left < right){int mid…...

【Java】线程实例化 线程状态 线程属性

线程实例化 继承 Thread 类 创建类继承自 Thread 类 . class MyThread extends Thread重写 run() 方法 . Overridepublic void run(){// 线程要执行的任务代码}实例化自定义线程类 . 实现 Runnable 接口 创建类实现 Runnable 接口 . class MyRunnable implements Runnable实…...

卫宁健康WiNGPT3.0与WiNEX Copilot 2.2:医疗AI创新的双轮驱动分析

引言:医疗AI的双翼时代 在医疗信息化的浪潮中,人工智能技术的深度融入正在重塑整个医疗行业。卫宁健康作为国内医疗健康和卫生领域数字化解决方案的领军企业,持续探索AI技术在医疗场景中的创新应用。2025年5月10日,在第29届中国医院信息网络大会(CHIMA2025)上,卫宁健康…...

I2C通讯

3.1. 本章节的代码仓库 1 2 3 4 5 6 #如之前有获取则可跳过 #获取仓库 git clone https://gitee.com/LubanCat/lubancat_rk_code_storage.git#代码所在的位置 lubancat_rk_code_storage/quick_start/i2c3.2. i2c I2C(Inter&#xff0d;Integrated Circuit)是一种通用的总线协…...

Excel实现单元格内容拼接

一、应用场景&#xff1a; 场景A&#xff1a;将多个单元格拼接&#xff0c;比如写测试用例时&#xff0c;将多个模块拼接&#xff0c;中间用“-”隔开 场景B&#xff1a;将某单元格内容插入另一单元格固定位置&#xff08;例如在B1中添加A1的内容&#xff09; 二、实际应用&a…...

2025前端面试遇到的问题(vue+uniapp+js+css)

Vue相关面试题 vue2和vue3的区别 一、核心架构差异 特性Vue2Vue3响应式系统基于Object.defineProperty基于Proxy&#xff08;支持动态新增/删除属性&#xff09;代码组织方式Options API&#xff08;data/methods分块&#xff09;Composition API&#xff08;逻辑按功能聚合&am…...

大模型核心基础简介

大模型核心基础简介目录 一、大模型简介定义核心特征 二、大模型的发展历程1. 早期奠基&#xff08;1950s–2010s&#xff09;1950s–1980s&#xff1a;神经网络萌芽1990s–2010s&#xff1a;深度学习前夜 2. 架构革命&#xff1a;Transformer的诞生与预训练范式&#xff08;20…...

广东省省考备考(第八天5.11)—言语:逻辑填空(每日一练)

错题 解析 第一空&#xff0c;搭配“期盼”&#xff0c;且根据“生命&#xff0c;是来自上天的馈赠”&#xff0c;可知父母对孩子的出生是非常期盼的。A项“望穿秋水”&#xff0c;形容对远地亲友的殷切盼望&#xff0c;C项“望眼欲穿”&#xff0c;形容盼望殷切&#xff0c;均…...

github+ Picgo+typora

github Picgotypora 本文将介绍如何使用Picgo在typora中实现上传服务 创建github仓库以及配置token 创建仓库 注意需要Initialize 添加README 配置为public 配置token github点击头像找到setting 选择Developer setting 配置token generate 选第一个第二个都行(我这里选第…...

[网安工具] IP 信息收集工具 —— LBD · 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 lbd | Kali Linux ToolsVideolbd Usage ExampleTest to see if the target domain (example.com) is using a load balancer:rootkali:~# lbd example.c…...

本贴会成为记录贴

这几天有些心力交瘁了 一方面带着对互联网下行的伤心&#xff0c;一方面是对未来的担忧 一转眼好像就是20 21那个 可以在宿舍肆意玩手机 大学生活 可是我不小了 是个26岁的人了 时间很快 快的就好像和自己开了一个玩笑 我以为可以找到一个自己足够喜欢的 可爱的人 可是我没有 …...

说说es配置项的动态静态之分和集群配置更新API

这天因为某件工作来到了es官网某个参数配置相关的页面&#xff0c;注意到了下图圆圈里的“Dynamic”&#xff1a; 链接&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cluster.html#misc-cluster-settings 显然这是对配置项的一个描述&am…...

LLMs之Mistral Medium 3:Mistral Medium 3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Mistral Medium 3&#xff1a;Mistral Medium 3的简介、安装和使用方法、案例应用之详细攻略 目录 Mistral Medium 3 简介 1、Mistral Medium 3 特点 Mistral Medium 3 安装和使用方法 2、使用方法 (1)、创建Agent (2)、模型微调 Mistral Medium 3 案例应用 Mistr…...

并发设计模式实战系列(17):信号量(Semaphore)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第十七章信号量&#xff08;Semaphore&#xff09;&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 信号量本质模型 2. 并发控制…...

RAGMCP基本原理说明和相关问题解惑

一、RAG架构原理和局限性 1.1 概念解释 RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;检索增强生成&#xff0c;让大模型接受外部输入后&#xff0c;总结输出 向量数据库&#xff1a;向量数据通常是高维空间中的点&#xff0c;代表复杂的数据结构…...

Java学习手册:服务注册与发现

一、服务注册与发现的概念 在微服务架构中&#xff0c;服务注册与发现是核心功能之一。由于微服务架构中服务实例的数量和位置是动态变化的&#xff0c;服务注册与发现机制允许服务实例在启动时自动注册到注册中心&#xff0c;并在停止时自动注销。其他服务可以通过查询注册中…...

双向Transformer:BERT(Bidirectional Encoder Representations from Transformers)

基于Transformer架构&#xff0c;通过双向上下文建模训练&#xff0c;提高完成任务的性能。 一 BERT的核心理念 1.1双向上下文建模依赖 之前讲的双向递归是用两个RNN进行&#xff0c;而BERT是通过Transformer的自注意力机制同时捕捉上下文信息。 1.1.1掩码语言模型&#xf…...

EdgeOne Pages MCP 入门教程

什么是MCP&#xff1f; MCP (Model Context Protocol) 是一个开放协议&#xff0c;允许 AI 模型安全地与本地和远程资源进行交互。通过在支持 MCP 的客户端&#xff08;如 Cline、Cursor、Claude 等&#xff09;上进行统一配置&#xff0c;可以让 AI 访问更多资源并使用更多工…...

Maven 公司内部私服中央仓库搭建 局域网仓库 资源共享 依赖包构建共享

介绍 公司内部私服搭建通常是为了更好地管理公司内部的依赖包和构建过程&#xff0c;避免直接使用外部 Maven 中央仓库。通过搭建私服&#xff0c;团队能够控制依赖的版本、提高构建速度并增强安全性。公司开发的一些公共工具库更换的提供给内部使用。 私服是一种特殊的远程仓…...

1688代采系统:技术架构与应用实践

在电商领域&#xff0c;1688 作为国内领先的 B2B 电商平台&#xff0c;拥有海量的商品信息。这些数据对于企业采购决策、市场分析、价格监控和供应链管理具有重要价值。本文将详细介绍如何使用 Python 爬虫技术&#xff0c;通过 1688 的商品详情接口&#xff08;item_search 和…...

一种混沌驱动的后门攻击检测指标

摘要 人工智能&#xff08;AI&#xff09;模型在各个领域的进步和应用已经改变了我们与技术互动的方式。然而&#xff0c;必须认识到&#xff0c;虽然人工智能模型带来了显著的进步&#xff0c;但它们也存在固有的挑战&#xff0c;例如容易受到对抗性攻击。目前的工作提出了一…...

【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?

Elasticsearch 深度解析&#xff1a;从原理到实践 一、为什么选择 Elasticsearch&#xff1f; 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同一个文档中&#xff0c;而不是分散…...

c++的模板和泛型编程

c的模板和泛型编程 泛型编程函数模板函数模板和模板函数函数模板的原理函数模板的隐式、显式实例化模板参数的匹配原则 类模板类模板的实例化模板的使用案例用函数模板运行不同的模板类用函数模板运行不同的STL容器 模板的缺省参数非类型模板参数模板的特化函数模板的特化类模板…...

Java从入门到精通 - 数组

数组 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录 数组1. 认识数组2. 数组的定义和访问2.1 静态初始化数组2.1.1 数组的访问2.1.1 定义代码实现总结 2.1.2 数组的遍历2.1.2.1 定义代码演示总结 案例代码实现 2.2 动态初始化…...

MySql事务索引

索引 1.使用 创建主键约束&#xff08;PRIMARY KEY&#xff09;、唯一约束&#xff08;UNIQUE&#xff09;、外键约束&#xff08;FOREIGN KEY&#xff09;时&#xff0c;会自动创建 对应列的索引。 2.创建索引&#xff08;普通索引&#xff09; 事务&#xff1a;要么全部…...

八股文-js篇

八股文-js篇 1. 延迟执行js的方式2. js的数据类型3. null 和 undefined的区别4. 和 的区别5. js微任务和宏任务6. js作用域7. js对象9. JS作用域this指向原型8. js判断数组9. slice作用、splice是否会改变原数组10. js数组去重11. 找出数组最大值12. 给字符串新增方法实现功能…...