zoukankan      html  css  js  c++  java
  • windows socket 完善数据简单结构化

    client

    //交互命令
    enum CMD {
        CMD_LOGIN,
        CMD_LOGIN_RESULT,
        CMD_LOGOUT,
        CMD_LOGOUT_RESULT,
        CMD_ERROR
    };
    //消息头
    struct DataHeader {
        int cmd;//消息指令
        int dataLength;//消息长度
    };
    //登录消息
    struct Login : public DataHeader {
        Login() {
            cmd = CMD_LOGIN;
            dataLength = sizeof(Login);
        }
        char szName[64];//用户名
        char szPass[64];//密码
    };
    //登录返回消息
    struct LoginResult : public DataHeader {
        LoginResult() {
            cmd = CMD_LOGIN_RESULT;
            dataLength = sizeof(LoginResult);
            iResult = 1;
        }
        int iResult;
    };
    //登出消息
    struct Logout : public DataHeader {
        Logout() {
            cmd = CMD_LOGOUT;
            dataLength = sizeof(Logout);
        }
        char szName[64];
    };
    //登出返回消息
    struct LogoutResult : public DataHeader {
        LogoutResult() {
            cmd = CMD_LOGOUT_RESULT;
            dataLength = sizeof(LogoutResult);
            iResult = 2;
        }
        int iResult;
    };
    //客户端完善结构化消息
    int function08() {
        SOCKET sktCli = init("192.168.3.18", 8080);
        if (sktCli == INVALID_SOCKET) {
            return -1;
        }
    
        while (true) {
            char szCmd[64] = { 0 };
            scanf("%s", szCmd);
            if (strcmp(szCmd, "exit") == 0) {
                printf("[client] exit ...
    ");
                break;
            }
    
            DataHeader dh = {0};
            if (strcmp(szCmd, "login") == 0) {
                Login login;
                strcpy(login.szName, "爱白菜的小昆虫登录");
                strcpy(login.szPass, "我不知道密码是啥");
                send(sktCli, (const char *)&login, sizeof(login), 0);
                LoginResult result;
                recv(sktCli, (char *)&result, sizeof(result), 0);
                printf("[server] cmd=%d dataLength=%d iResult=%d
    ", result.cmd, result.dataLength, result.iResult);
            }
            else if(strcmp(szCmd, "logout") == 0){
                Logout logout;
                strcpy(logout.szName, "爱白菜的小昆虫退出");
                send(sktCli, (const char *)&logout, sizeof(logout), 0);
                LogoutResult result;
                recv(sktCli, (char *)&result, sizeof(result), 0);
                printf("[server] cmd=%d dataLength=%d iResult=%d
    ", result.cmd, result.dataLength, result.iResult);
            }
            else {
            }
        }
    
        destroy(sktCli);
        return 0;
    }

    server

    //交互命令
    enum CMD{
        CMD_LOGIN,
        CMD_LOGIN_RESULT,
        CMD_LOGOUT,
        CMD_LOGOUT_RESULT,
        CMD_ERROR
    };
    //消息头
    struct DataHeader {
        int cmd;//消息指令
        int dataLength;//消息长度
    };
    //登录消息
    struct Login : public DataHeader{
        Login() {
            cmd = CMD_LOGIN;
            dataLength = sizeof(Login);
        }
        char szName[64];//用户名
        char szPass[64];//密码
    };
    //登录返回消息
    struct LoginResult : public DataHeader {
        LoginResult() {
            cmd = CMD_LOGIN_RESULT;
            dataLength = sizeof(LoginResult);
            iResult = 1;
        }
        int iResult;
    };
    //登出消息
    struct Logout : public DataHeader {
        Logout() {
            cmd = CMD_LOGOUT;
            dataLength = sizeof(Logout);
        }
        char szName[64];
    };
    //登出返回消息
    struct LogoutResult : public DataHeader {
        LogoutResult() {
            cmd = CMD_LOGOUT_RESULT;
            dataLength = sizeof(LogoutResult);
            iResult = 2;
        }
        int iResult;
    };
    //服务端完善结构化消息
    int function08() {
        SOCKET sktServ = init("0.0.0.0", 8080);
        if (sktServ == INVALID_SOCKET) {
            return -1;
        }
    
        SOCKET sktCli = accept(sktServ, NULL, NULL);
        while (true) {
            DataHeader header;
            int ret = recv(sktCli, (char *)&header, sizeof(header), 0);
            if (ret == SOCKET_ERROR) {
                printf("[server] recv error ...
    ");
                break;
            }
            if (ret == 0) {
                printf("[client] exit ...
    ");
                break;
            }
            printf("[client] cmd=%d datalength=%d
    ", header.cmd, header.dataLength);
            
            switch (header.cmd) {
            case CMD_LOGIN: {
                Login login;
                //客户端发送login结构体,但是服务端前面接受了DataHeader,所以这里只需要接受剩下的消息
                recv(sktCli, (char *)&login + sizeof(DataHeader), sizeof(login) - sizeof(DataHeader), 0);
                printf("[client] name=%s pass=%s
    ", login.szName, login.szPass);
    
                LoginResult result;
                send(sktCli, (const char *)&result, sizeof(result), 0);
                break;
            }
            case CMD_LOGOUT: {
                Logout logout;
                //客户端发送login结构体,但是服务端前面接受了DataHeader,所以这里只需要接受剩下的消息
                recv(sktCli, (char *)&logout + sizeof(DataHeader), sizeof(logout) - sizeof(DataHeader), 0);
                printf("[client] name=%s
    ", logout.szName);
    
                LogoutResult result;
                send(sktCli, (const char *)&result, sizeof(result), 0);
                break;
            }
            default:
                break;
            }
        }
    
        destroy(sktServ);
        return 0;
    }
  • 相关阅读:
    JQuery实现数组移除指定元素
    美团酒旅面经
    搜狗一面
    360面经
    头条面经
    搜狐笔试题
    kolakoski序列
    函数的节流
    隐藏元素的几种方法
    移动端适配与响应式布局
  • 原文地址:https://www.cnblogs.com/xuqiulin/p/11437696.html
Copyright © 2011-2022 走看看