4.15和4.16、TCP通信实现(本机)

4.15和4.16、TCP通信实现(本机)

1.TCP通信

在这里插入图片描述

①TCP通信(服务端)

#include <iostream>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>

using namespace std;

int main() {
    
    

    // 1.创建socket(用于监听的套接字)
    int server_listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_listen_fd == -1) {
    
    
        perror("socket");
        exit(-1);
    }

    // 2.绑定ip和端口
    sockaddr_in saddr;
    saddr.sin_addr.s_addr = INADDR_ANY;  //0.0.0.0
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);

    int bind_ret = bind(server_listen_fd, (sockaddr *)&saddr, sizeof(saddr));
    if (bind_ret) {
    
    
        perror("bind");
        exit(-1);
    }

    // 3.监听客户端的连接请求
    int listen_ret = listen(server_listen_fd, 8);
    if (listen_ret == -1) {
    
    
        perror("listen");
        exit(-1);
    }

    // 4.阻塞进程,等待客户端的请求,接收客户端连接
    sockaddr_in caddr;
    socklen_t client_len = (socklen_t)sizeof(caddr);
    int client_fd = accept(server_listen_fd, (sockaddr *)&caddr, &client_len);
    if (client_fd == -1) {
    
    
        perror("accept");
        exit(-1);
    }

    // 输出客户端信息
    char client_ip[16];
    inet_ntop(AF_INET, &caddr.sin_addr.s_addr, client_ip, sizeof(client_ip));
    unsigned short client_port = ntohs(caddr.sin_port);

    printf("client ip is:%s, client port is:%d\n", client_ip, client_port);

    // 5.服务端接收数据
    char recvBuf[1024] = {
    
    0};
    while (1) {
    
    
        
        // 读取客户端数据
        int read_ret = read(client_fd, recvBuf, sizeof(recvBuf));
        if (read_ret == -1) {
    
    
            perror("read");
            exit(-1);
        } else if (read_ret > 0) {
    
    
            printf("recv client data is %s\n", recvBuf);
        } else if (read_ret == 0) {
    
    
            cout << "server closed..." << endl;
            break;
        }

        // 给客户端发送数据
        const char * data = "hello, I am server";
        int write_ret = write(client_fd, data, strlen(data));


    }

    // 6.关闭文件描述符(socket)
    close(client_fd);
    close(server_listen_fd);

    return 0;
}

②TCP通信(客户端)

#include <iostream>
#include <unistd.h>
#include <arpa/inet.h>
#include <cstring>

using namespace std;

int main()
{
    
    
    // 1.创建客户端socket
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd == -1) {
    
    
        perror("socket");
        exit(-1);
    }

    // 2.连接服务端
    // 设置需要连接的服务器的 ip 和端口
    sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;   // 设置为ipv4协议
    // 将点分十进制ip转换为newwork字节序
    int pton_ret = inet_pton(AF_INET, "192.168.246.130", &server_addr.sin_addr.s_addr);
    // 将主机序端口转换为newwork字节序端口
    server_addr.sin_port = htons(9999);

    int cone_ret = connect(client_fd, (sockaddr *)&server_addr, sizeof(server_addr));
    if (cone_ret == -1) {
    
    
        perror("connect");
        exit(-1);
    }

    // 3.读写服务端数据
    char recvBuf[1024] = {
    
    0};
    while (1) {
    
    
        
        // 往服务端写数据
        const char * data = "hello, I am client";
        write(client_fd, data, strlen(data));

        sleep(1);

        // 接手服务端数据
        int read_ret = read(client_fd, recvBuf, sizeof(recvBuf));
        if (read_ret == -1) {
    
    
            perror("read");
            exit(-1);
        } else if (read_ret > 0) {
    
    
            printf("recv client data is %s\n", recvBuf);
        } else if (read_ret == 0){
    
    
            cout << "server closed..." << endl;
            break;
        }

    }

    // 关闭文件描述符
    close(client_fd);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/z2812470857/article/details/130176955
今日推荐