• 【网络编程实例】C++11实现基于TCP的回射服务器和客户端通信


    参考《TCP/IP网络编程第四章》

    服务器端代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    
    using std::cout;
    using std::cin;
    using std::string;
    using std::endl;
    
    #define BUF_SIZE 1024
    #define SERVER_IP "127.0.0.1"    // 指定服务端的IP
    #define SERVER_PORT 9190            // 指定服务端的port
    
    
    int main() {
        int serv_sock, clnt_sock;
        char message[BUF_SIZE];
        int str_len, i;
        struct sockaddr_in serv_adr, clnt_adr;
        socklen_t clnt_adt_sz;
    
        serv_sock = socket(PF_INET, SOCK_STREAM, 0);
        if(serv_sock == -1) cout <<"Create socket error" << errno << ": " << strerror(errno) << endl;
    
        bzero(&serv_adr, sizeof(serv_adr));
        serv_adr.sin_family = AF_INET;
        serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_adr.sin_port = htons(SERVER_PORT);
    
        if(bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1) 
            cout << "Bind error" << errno << ": " << strerror(errno) << endl;
    
        if(listen(serv_sock, 5) == -1) 
             cout << "Listen error" <<  errno << ": " << strerror(errno) << endl;
    
        clnt_adt_sz = sizeof(clnt_adr);
    
        //调用 5 次 accept 函数,共为 5 个客户端提供服务
        for(int i = 0; i != 5; ++i) {
            clnt_sock = accept(serv_sock, (struct sockaddr*) &clnt_adr, &clnt_adt_sz);
            if(clnt_sock == -1) 
                cout << "Accept error" << errno << ": " << strerror(errno) << endl;
            else  
                cout << "Connect client" << i + 1 << endl;
    
            while((str_len = read(clnt_sock, message, BUF_SIZE) != 0))
                write(clnt_sock, message, str_len);
            
            close(clnt_sock);
        }
        close(serv_sock);
        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

    客户端代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    
    using std::cout;
    using std::cin;
    using std::string;
    using std::endl;
    
    #define BUFFSIZE 1024
    #define SERVER_IP "127.0.0.1"    // 指定服务端的IP
    #define SERVER_PORT 9190            // 指定服务端的port
    
    
    int main()
    {
        int sock;
        char message[BUFFSIZE];
        int str_len;
        struct sockaddr_in serv_adr;
    
        sock = socket(PF_INET, SOCK_STREAM, 0);
        if(sock == -1) cout << "socket() error" << endl;
    
        bzero(&serv_adr, sizeof(serv_adr));
    
        serv_adr.sin_family = AF_INET;
        serv_adr.sin_addr.s_addr = inet_addr(SERVER_IP);
        serv_adr.sin_port = htons(SERVER_PORT);
    
        if(connect(sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
            cout << "connect() error: " << errno << " " << strerror(errno) << endl;
        else
            cout << "connected............" << endl;
    
        while(1)
        {
            cout << "Input message(Q to quit): " << endl;
            cin >> message;
            if(!strcmp(message, "q") || !strcmp(message, "Q"))
                break;
    
            write(sock, message, strlen(message));
            str_len = read(sock, message, BUFFSIZE - 1);
            message[str_len] = 0;
            cout << "Message from server:" << message << endl;
        }
        close(sock);
        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
  • 相关阅读:
    【Redis】之高并发场景下主从同步数据一致性问题探究
    第十二天Tensorflow基础和简单的线性回归实现
    Spring Boot + Activiti 完美结合,快速实现工作流~
    软考中级-软件设计师-视频学习时长记录
    SpringBoot中的yml文件中读取自定义配置信息
    终于搞懂了!原来vue3中template使用ref无需.value是因为这个
    Unity 时间定时调度系统
    spring boot网上眼镜商场毕业设计-附源码241659
    【微服务】Nacos Discovery--服务治理
    llava1.5-部署
  • 原文地址:https://blog.csdn.net/weixin_42659457/article/details/127854287