• 基于Linux和C++的socket编程示例(TCP)


    原文地址:https://www.geeksforgeeks.org/socket-programming-cc/

    服务端

    // Server side C program to demonstrate Socket
    // programming
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define PORT 8080
    
    int main(int argc, char const* argv[])
    {
        int server_fd, new_socket;
        ssize_t valread;
        struct sockaddr_in address;
        int opt = 1;
        socklen_t addrlen = sizeof(address);
        char buffer[1024] = { 0 };
        const char* hello = "Hello from server";
    
        // AF_INET表示IPV4网络通信领域。SOCKET_STREAM表示TCP,即流式。0表示默认(也可以填6表示TCP)
        if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
            perror("socket failed");
            exit(EXIT_FAILURE);
        }
        // SOL_SOCKET表示套接字级别的选项。SO_REUSEADDR表示服务关闭后,地址和端口可重入。这段可删
        if (setsockopt(server_fd, SOL_SOCKET,
                    SO_REUSEADDR, &opt,
                    sizeof(opt))) {
            perror("setsockopt");
            exit(EXIT_FAILURE);
        } //这段可删
    
        address.sin_family = AF_INET; //设置协议簇为IPV4
        address.sin_addr.s_addr = INADDR_ANY; //设置服务端接收的套接字的IP地址,INADDR_ANY表示任何本地地址
        address.sin_port = htons(PORT);//设置端口号为8080
    
        // Forcefully attaching socket to the port 8080
        if (bind(server_fd, (struct sockaddr*)&address,
                sizeof(address))
            < 0) {
            perror("bind failed");
            exit(EXIT_FAILURE);
        }
    
        //3表示消息等待队列的最大长度
        if (listen(server_fd, 3) < 0) {
            perror("listen");
            exit(EXIT_FAILURE);
        }
        if ((new_socket = accept(server_fd, (struct sockaddr*)&address, &addrlen)) < 0) {
            perror("accept");
            exit(EXIT_FAILURE);
        }
        valread = read(new_socket, buffer,
                    1024 - 1); // subtract 1 for the null
                                // terminator at the end
        printf("%s\n", buffer);
        send(new_socket, hello, strlen(hello), 0);
        printf("Hello message sent\n");
    
        // closing the connected socket
        close(new_socket);
        // closing the listening socket
        close(server_fd);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    客户端

    // Client side C program to demonstrate Socket
    // programming
    #include 
    #include 
    #include 
    #include 
    #include 
    #define PORT 8080
    
    int main(int argc, char const* argv[])
    {
        int status, valread, client_fd;
        struct sockaddr_in serv_addr;
        const char* hello = "Hello from client";
        char buffer[1024] = { 0 };
        if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
            printf("\n Socket creation error \n");
            return -1;
        }
    
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(PORT);
    
        // Convert IPv4 and IPv6 addresses from text to binary
        // form
        if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)
            <= 0) {
            printf(
                "\nInvalid address/ Address not supported \n");
            return -1;
        }
    
        if ((status
            = connect(client_fd, (struct sockaddr*)&serv_addr,
                    sizeof(serv_addr)))
            < 0) {
            printf("\nConnection Failed \n");
            return -1;
        }
        send(client_fd, hello, strlen(hello), 0);
        printf("Hello message sent\n");
        valread = read(client_fd, buffer,
                    1024 - 1); // subtract 1 for the null
                                // terminator at the end
        printf("%s\n", buffer);
    
        // closing the connected socket
        close(client_fd);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    结果如下图:
    在这里插入图片描述

  • 相关阅读:
    SpringCache--缓存框架 ----苍穹外卖day7
    【ESD专题】TVS管的选择的误区及钳位电压测试方法
    计算机视觉40例之案例12手写数字识别
    机械人必须要知道的多轴滑台模组应用
    手记系列之六 ----- 分享个人使用kafka经验
    开源ide 类idea 风格
    Procreate iPad绘画教程
    Jenkins编译第三方jar包失败: Could not resolve dependencies for project:xxx
    Windows——一篇文章搞定字符编码
    2.Spring的优缺点是什么?
  • 原文地址:https://blog.csdn.net/weixin_43158544/article/details/136695727