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 
#include 
#include 
#include 
#include 
#include 

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 

你可能感兴趣的:(C++,c++,tcp/ip,网络)