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

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>
http://www.xdnf.cn/news/397225.html

相关文章:

  • 【C++进阶】第3课—二叉搜索树
  • C++猴子摘桃 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • [超详细,推荐!!!]前端性能优化策略详解
  • VC++ 获取CPU信息的两种方法
  • POSIX信号量
  • 【软件测试】基于项目驱动的功能测试报告(持续更新)
  • k8s中ingress-nginx介绍
  • Spring Boot 中的重试机制
  • 【Python】Python类型标注革命:Annotated类型深度解析与实战
  • 匈牙利算法
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(十七)
  • java中对象的比较
  • 【文献阅读】地方政府驱动企业参与乡村振兴的机制——乡村振兴注意力视角的分析
  • 【工作记录】crmeb后端项目打开、运行
  • 【Flask开发踩坑实录】pip 安装报错:“No matching distribution found” 的根本原因及解决方案!
  • 1688 开放平台接口对接实战:商品实时数据采集 API 开发全流程
  • cmake:test project
  • OSPF的特殊区域
  • P10225 [COCI 2023/2024 #3] Milano C.le|普及
  • LeetCode 热题 100 543. 二叉树的直径
  • RS485和RS232 通信配置
  • TikTok 运营干货:内容创作与 AI 增效
  • 【高数上册笔记01】:从集合映射到区间函数
  • istio in action之应用弹性与容错机制
  • Babel 插件与预设的区别及使用
  • 每日脚本 5.11 - 进制转换和ascii字符
  • FlySecAgent:——MCP全自动AI Agent的实战利器
  • 运算放大器稳定性分析
  • MyBatis源码解读4(2.3、MyBatis运行流程)
  • 当虚拟吞噬现实——《GTA6》结合技术