当前位置: 首页 > 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>

相关文章:

  • 【数据结构】前言
  • DEEPPOLAR:通过深度学习发明非线性大核极坐标码(1)
  • Day 5:Warp高级定制与自动化
  • Unity3D仿星露谷物语开发42之粒子系统
  • OBS studio 减少音频中的杂音(噪音)
  • OSCP备战-kioptrixvm3详细解法
  • CMOS内存的地址空间在主内存空间中吗?
  • sunset:Solstice靶场
  • C++学习之STL学习
  • PowerShell 脚本中文乱码处理
  • 力扣热题100之合并两个有序链表
  • 软件架构师知识点总结
  • Java常用类-比较器
  • 华为云Flexus+DeepSeek征文|DeepSeek-V3/R1商用服务开通教程以及模型体验
  • [Java实战]Spring Boot 静态资源配置(十三)
  • ARM GIC(七)亲和路由:GICD_IROUTER寄存器具体如何与MPIDR配合使用?
  • 2050年的世界是怎样的?
  • tensorflow 1.x
  • AI智慧公园管理方案:用科技重塑市民的“夜游体验”
  • kubectl系列(十二):查询pod的resource 配置
  • 李强会见巴西总统卢拉
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 复旦大学与上海杨浦共建市东医院
  • 济南市委副秘书长吕英伟已任历下区领导
  • 减重人生|走过节食弯路,她如何半年减60斤找回自信?