南工程聊天室客户端源码

MyMsg.h
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma once  
  2. /************************************************************  
  3. *  文件名:MyMsg.h  
  4. *  描述:  服务器和客户端共用的头文件,消息定义  
  5. *************************************************************/  
  6. #ifndef _MYMSG_H_  
  7. #define _MYMSG_H_  
  8.   
  9. enum {  
  10.     LOGIN_MSG,           //登录  
  11.     LOGIN_MSG_RES,       //登录响应  
  12.     QUERY_FQQ,           //查询单个好友QQ  
  13.     QUERY_FQQ_RES,       //查询单个好友QQ的响应  
  14.     TALK_MSG,             //聊天  
  15.     REQUEST_ALL_FRD,      //请求所有qq好友信息  
  16.     APPLY_ALL_FRD        //应答所有qq好友信息  
  17. };  
  18.   
  19. struct LoginMsg {  
  20.     unsigned char id;  //消息编号  
  21.     char qq[6];        //登录ID号  
  22. };  
  23.   
  24. struct LoginMsgResponse {  
  25.     unsigned char id;  //消息编号  
  26.     unsigned char isOK;  
  27.     char reason[100];    //如果失败,则在此写入失败原因  
  28. };  
  29.   
  30. struct FriendQqMsg {  
  31.     unsigned char id;  //消息编号  
  32.     char qq[6];  
  33. };  
  34.   
  35. struct FriendQqMsgResponse {  
  36.     unsigned char id;  //消息编号  
  37.     unsigned char isOK;  
  38. };  
  39.   
  40. struct TalkMsg {  
  41.     unsigned char id;  //消息编号  
  42.     char qq[6];  
  43.     char fqq[6];  
  44.     char info[200];  
  45. };  
  46.   
  47. struct RequestAllFriend {  
  48.     unsigned char id;   //消息编号  
  49. };  
  50.   
  51. struct AllFriendMsg {  
  52.     unsigned char id;  //消息编号  
  53.     char qq[6];  
  54. };  
  55.   
  56. #endif  

MyTcp.cpp
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************  
  2. *  文件名:MyTCP.cpp  
  3. *  描述:  TCP/IP通信socket封装  
  4. *************************************************************/  
  5. #include <stdio.h>  
  6. #include <WinSock2.h>  
  7. #include "MyTools.h"  
  8. #pragma comment (lib, "ws2_32.lib")  
  9.   
  10. #define PORT 5001  
  11. int ls;   //侦听套接字  
  12. int flag;//记录服务器或是客户端的标志  
  13.   
  14.          /*   描述: 初始化服务器或客户端, 该函数在使用中必需首先调用,客户端和服务器 */  
  15. int initSock(int IsServer)  
  16. {  
  17.     WSADATA data;  
  18.   
  19.     if (WSAStartup(1, &data) <0)  
  20.         printMsgExit("call WSAStartup() failure!");  
  21.   
  22.     ls = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
  23.     if (ls < 0)  
  24.         printMsgExit("创建套接字失败!");  
  25.   
  26.     flag = IsServer;  
  27.     if (IsServer != 0)  
  28.     {//服务器  
  29.         struct sockaddr_in servAddr;  
  30.         memset(&servAddr, 0, sizeof(servAddr));  
  31.         servAddr.sin_family = AF_INET;  
  32.         servAddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  33.         servAddr.sin_port = htons(PORT);  
  34.   
  35.         if (bind(ls, (struct sockaddr *)&servAddr, sizeof(servAddr))<0) {  
  36.             printMsg("bind套接字失败!\n");  
  37.             return -1;  
  38.         }  
  39.   
  40.         if (listen(ls, 10)<0) {  
  41.             printMsg("listen套接字失败!\n");  
  42.             return -1;  
  43.         }  
  44.     }  
  45.   
  46.     return 0;  
  47. }  
  48.   
  49. /*   描述: 仅用于客户端, 连接服务器 */  
  50. int tcpConnect(const char *serverIP, unsigned short port)  
  51. {  
  52.     struct sockaddr_in servAddr;  
  53.   
  54.     memset(&servAddr, 0, sizeof(servAddr));  
  55.     servAddr.sin_family = AF_INET;  
  56.     servAddr.sin_addr.s_addr = inet_addr(serverIP);  
  57.     servAddr.sin_port = htons(port);  
  58.   
  59.     if (connect(ls, (struct sockaddr *)&servAddr, sizeof(servAddr))<0)  
  60.     {  
  61.         printMsgExit("连接服务器失败!\n");  
  62.     }  
  63.   
  64.     return ls;  
  65. }  
  66.   
  67. /* 描述: 发送数据 */  
  68. int tcpSend(unsigned int sock, const char *sendBuf, int sendBufLen)  
  69. {  
  70.     int len = send(sock, sendBuf, sendBufLen, 0);  
  71.     return len;  
  72. }  
  73.   
  74. /* 描述: 接收数据 */  
  75. int tcpRecv(unsigned int sock, char *recvBuf, int recvBufLen)  
  76. {  
  77.     int len = recv(sock, recvBuf, recvBufLen, 0);  
  78.     return len;  
  79. }  
  80.   
  81. void tcpClose(unsigned int sock)  
  82. {  
  83.     closesocket(sock);  
  84.     WSACleanup();  
  85. }  

MyTcp.h
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma once  
  2. /************************************************************  
  3. *  文件名:MyTCP.h  
  4. *  描述:  TCP通信头文件  
  5. *************************************************************/  
  6. #ifndef _MYTCP_H_  
  7. #define _MYTCP_H_  
  8.   
  9. int initSock(int IsServer);  
  10. int tcpConnect(const char *serverIP, unsigned short port);  
  11. int tcpAccept();  
  12. int tcpSend(unsigned int sock, const char *sendBuf, int sendBufLen);  
  13. int tcpRecv(unsigned int sock, char *recvBuf, int recvBufLen);  
  14. void tcpClose(unsigned int sock);  
  15.   
  16. #endif   

MyTools.cpp
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************  
  2. *  文件名:MyTools.cpp  
  3. *  描述:  共用的文件,工具函数定义  
  4. *************************************************************/  
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. #include "MyTools.h"  
  8.   
  9. extern int flag;  
  10.   
  11. void printMsg(const char * msg) {  
  12.     if (flag)  
  13.         printf("\t【南工服务器豪华版】%s", msg);  
  14.     else  
  15.         printf("\t【南工客户端豪华版】%s", msg);  
  16. }  
  17.   
  18. void printInt(int value) {  
  19.     if (flag)  
  20.         printf("\t【南工服务器豪华版】%d", value);  
  21.     else  
  22.         printf("\t【南工客户端豪华版】%d", value);  
  23. }  
  24.   
  25. void printMsgExit(const char * msg) {  
  26.     printMsg(msg);  
  27.     exit(0);  
  28. }  
  29.   
  30. void printIntExit(int value) {  
  31.     printInt(value);  
  32.     exit(0);  
  33. }  
MyTools.h
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #pragma once  
  2. /************************************************************  
  3. *  文件名:MyTools.h  
  4. *  描述:工具函数定义  
  5. *************************************************************/  
  6. #ifndef _MYTOOLS_H_  
  7. #define _MYTOOLS_H_  
  8. void printMsgExit(const char * msg);  
  9. void printMsg(const char * msg);  
  10. void printInt(int value);  
  11. void printIntExit(int value);  
  12. #endif  

TalkClient.cpp
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************  
  2. *  文件名:TalkClient.cpp  
  3. *  描述:  客户端入口,界面操作  
  4. *************************************************************/  
  5. #include <stdio.h>  
  6. #include <Windows.h>  
  7.   
  8. #include "TalkClientService.h"  
  9.   
  10. void displayMenu();  
  11. void exitProc();  
  12. void defProc();  
  13. void procMenu();  
  14.   
  15. char serverip[6];  
  16.   
  17. int main(int argc, char *argv[])  
  18. {     
  19.     if (argc < 2)  
  20.     {  
  21.         printf("请输入服务器的IP地址。。。\n");  
  22.         return 0;  
  23.     }  
  24.     strcpy(serverip, argv[1]);  
  25.     displayMenu();  
  26.     procMenu();  
  27.     while (1) Sleep(10000);  
  28. }  
  29.   
  30. char ch;     //菜单选择  
  31. void displayMenu()  
  32. {  
  33.     static int t = 1;  
  34.     if (t++ == 1)  
  35.     {  
  36.         printf("\n\n\n\n\n");  
  37.         printf("\n\t      @                                                             @        ");  
  38.         printf("\n\t    @ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @      ");  
  39.         printf("\n\t   @  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   @    ");  
  40.         printf("\n\t  @   **      **  **********  **        **         ********   **  **     @   ");  
  41.         printf("\n\t @    **      **  **          **        **        **      **  **  **      @  ");  
  42.         printf("\n\t @    **      **  **          **        **        **      **  **  **       @  ");  
  43.         printf("\n\t @    **********  **********  **        **        **      **  **  **       @  ");  
  44.         printf("\n\t @    **      **  **          **        **        **      **  **  **       @  ");  
  45.         printf("\n\t @    **      **  **          **        **        **      **              @  ");  
  46.         printf("\n\t  @   **      **  **********  ********  ********   ********   @@  @@     @   ");  
  47.         printf("\n\t   @   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  @    ");  
  48.         printf("\n\t    @  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@      ");  
  49.         printf("\n\t      @                                                             @        ");  
  50.   
  51.         printf("\n                                                             -----By Hins    ");  
  52.         printf("\n\n\n\n\n\t\tPress 'Enter' to enter the menu......");           /*按任一键进入主菜单*/  
  53.     }  
  54.     getchar();                                 /*从键盘读取一个字符,但不显示于屏幕*/  
  55.     system("cls"); /*清屏*/  
  56.     printf("\n");  
  57.     printf("\n");  
  58.     printf("\n");  
  59.     printf("\t************************************************\n");  
  60.     printf("\t*                                              *\n");  
  61.     printf("\t*         南工2016聊天客户端程序               *\n");  
  62.     printf("\t*         Version 2.1     豪华版               *\n");  
  63.     printf("\t*                                              *\n");  
  64.     printf("\t*                                              *\n");  
  65.     printf("\t*                                              *\n");  
  66.     printf("\t*           1) 登录(L)                         *\n");  
  67.     printf("\t*           2) 退出(e)                         *\n");  
  68.     printf("\t*                      by---HinsShwan          *\n");  
  69.     printf("\t************************************************\n");  
  70.     printf("\n");  
  71.     connectServer();  
  72.     printf("\t您的选择是:");  
  73.     ch = getchar();  
  74. }  
  75.   
  76. void procMenu()  
  77. {  
  78.     switch (ch)  
  79.     {  
  80.     case 'l':  
  81.     case 'L':  
  82.     case '1':  
  83.         statusConnected();  
  84.         break;  
  85.   
  86.     case 'e':  
  87.     case 'E':  
  88.     case '2':  
  89.         exitProc();  
  90.         break;  
  91.   
  92.     default:  
  93.         defProc();  
  94.     }  
  95. }  
  96.   
  97. void exitProc()  
  98. {  
  99.     printf("\t客户端程序已经终止!\n");  
  100.     exit(0);  
  101. }  
  102.   
  103. void defProc()  
  104. {  
  105.     printf("\t 输入字符错误!\n");  
  106. }  

TalkClientService.cpp
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /************************************************************  
  2. *  文件名:TalkClientService.cpp  
  3. *  描述:  客户端业务实现  
  4. *************************************************************/  
  5. #include "MyTCP.h"  
  6. #include "MyTools.h"  
  7. #include "TalkClientService.h"  
  8. void myRecvThread();  
  9. #define PORT 5001  
  10.   
  11.   
  12. extern char serverip[6];  
  13.   
  14. char qq[6] = { 0 };  
  15. char fqq[6] = { 0 };  
  16. int sock;  
  17.   
  18. int status = STUS_START;  
  19.   
  20. void mainProc()  
  21. {  
  22.     while (1)  
  23.     {  
  24.   
  25.         switch (status)  
  26.         {  
  27.         case STUS_CONNECTED:  
  28.             statusConnected();  
  29.             break;  
  30.   
  31.         case STUS_WAIT_LOGIN_RES:  
  32.             printMsg("等待服务器响应..........\n");  
  33.             Sleep(1000);  
  34.             break;  
  35.   
  36.         case STUS_LOGINED:  
  37.             statusLogined();  
  38.             break;  
  39.   
  40.         case STUS_WAIT_QUERY_FQQ_RES:  
  41.             printMsg("等待服务器响应..........\n");  
  42.             Sleep(1000);  
  43.             break;  
  44.   
  45.         case STUS_TALK:  
  46.             statusTalk();  
  47.             break;  
  48.         case STUS_WAIT_QUERY_ALLQQ_RES:  
  49.             printMsg("等待服务器响应..........\n");  
  50.             Sleep(1000);  
  51.             break;  
  52.         }  
  53.     }  
  54. }  
  55.   
  56. void statusTalk()  
  57. {  
  58.     printMsg("退出聊天(Exit) 我说>>");  
  59.     setbuf(stdin, NULL);   //清空键盘缓冲区  
  60.   
  61.     char buf[1024] = { 0 };  
  62.     gets_s(buf);  
  63.     if (strcmp(buf, "Exit") == 0)  
  64.     {  
  65.         printMsg("客户端已经退出!\n");  
  66.         statusLogined();  
  67.     }  
  68.   
  69.     else  
  70.     {  
  71.         struct TalkMsg msg;  
  72.   
  73.         msg.id = TALK_MSG;  
  74.         strcpy(msg.qq, qq);  
  75.         strcpy(msg.fqq, fqq);  
  76.         strcpy(msg.info, buf);  
  77.         status = 5;  
  78.         tcpSend(sock, (const char *)&msg, sizeof(msg));  
  79.     }  
  80.   
  81.     return;  
  82. }  
  83.   
  84. void statusLogined()  
  85. {  
  86.     char buf0[10] = { 0 };  
  87.     int rt = 0;  
  88.     while (rt == 0)  
  89.     {  
  90.         memset(buf0, 0, sizeof(buf0));  
  91.         printMsg("显示在线好友(L)|找好友聊天(T)|退出(E) 默认(T)>>");  
  92.         setbuf(stdin, NULL);   //清空键盘缓冲区  
  93.         gets_s(buf0);  
  94.         if (strcmp(buf0, "T") == 0 || strcmp(buf0, "t") == 0)  
  95.         {  
  96.             printMsg("选择聊天好友......\n");  
  97.             while (1)  
  98.             {  
  99.                 printMsg("输入聊天好友QQ号(最多不超过5位):  退出请输入“quit”");  
  100.                 char tmp[1024];  
  101.                 scanf("%s", tmp);  
  102.                 if (strlen(tmp) > 5)  
  103.                 {  
  104.                     printMsg("您输入的qq号长度大于5个,请重新输入\n");  
  105.                 }  
  106.                 else if (strcmp(tmp, qq) == 0)  
  107.                 {  
  108.                     printMsg("您输入的qq号是自己号码,难道您要自言自语吗?::) 请重新输入\n");  
  109.                 }  
  110.                 else if (strcmp(tmp, "quit") == 0)  
  111.                     break;  
  112.                 else  
  113.                 {   //发送要聊天的好友QQ号给服务器  
  114.                     struct FriendQqMsg msg;  
  115.                     msg.id = QUERY_FQQ;  
  116.                     strcpy(msg.qq, tmp);  
  117.                     strcpy(fqq, tmp);  
  118.                     status = STUS_WAIT_QUERY_FQQ_RES;  
  119.                     tcpSend(sock, (const char *)&msg, sizeof(msg));  
  120.                     rt = 1;  
  121.                     break;  
  122.                 }  
  123.             }  
  124.         }  
  125.         else if (strcmp(buf0, "L") == 0 || strcmp(buf0, "l") == 0)  
  126.         {  
  127.             char buf2[10] = { 0 };  
  128.             memset(buf2, 0, sizeof(buf2));  
  129.             struct RequestAllFriend res;  
  130.             res.id = REQUEST_ALL_FRD;  
  131.             memcpy(buf2, &res, sizeof(res));  
  132.             tcpSend(sock, (const char*)buf2, sizeof(buf2));  
  133.             status = STUS_WAIT_QUERY_ALLQQ_RES;  
  134.             Sleep(100);  
  135.         }  
  136.         else if (strcmp(buf0, "E") == 0 || strcmp(buf0, "e") == 0)  
  137.         {  
  138.             printMsg("客户端已经退出!\n");  
  139.             exit(0);  
  140.         }  
  141.         else  
  142.         {  
  143.             printMsg("输入内容错误(手抖了吧-_-),请重新输入\n");  
  144.   
  145.         }  
  146.   
  147.   
  148.     };  
  149.   
  150. }  
  151.   
  152. void connectServer()  
  153. {  
  154.     printMsg("开始连接服务器......\n");  
  155.     initSock(0);  //客户端  
  156.     sock = tcpConnect(serverip, PORT);  
  157.     printMsg("连接服务器成功!\n");  
  158.   
  159.     //创建一个线程用于接收服务器发送的信息  
  160.     DWORD threadId;  
  161.     CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myRecvThread, NULL, 0, &threadId);  
  162. }  
  163.   
  164. //创建接收线程专用于接收并处理服务器返回的收数据  
  165. void myRecvThread()  
  166. {  
  167.     char buf[1024] = { 0 };  
  168.     while (1)  
  169.     {  
  170.         memset(buf, 0, sizeof(buf));  
  171.         tcpRecv(sock, buf, sizeof(buf));  
  172.         unsigned char id = (unsigned char)buf[0];  
  173.         switch (id)  
  174.         {  
  175.         case LOGIN_MSG_RES:  
  176.             procLoginMsgResponse((struct LoginMsgResponse *)buf);  
  177.             break;  
  178.   
  179.         case QUERY_FQQ_RES:  
  180.             procFriendQqMsgResponse((struct FriendQqMsgResponse *)buf);  
  181.             break;  
  182.   
  183.         case TALK_MSG:  
  184.             procTalkMsg((struct TalkMsg *)buf);  
  185.             break;  
  186.         case APPLY_ALL_FRD:  
  187.             procApplyAllFriend((struct AllFriendMsg *)buf);  
  188.             break;  
  189.   
  190.         }  
  191.     }  
  192.     sprintf(buf, "结束myRecvThread线程:%d.........\n");  
  193.     printMsg(buf);  
  194.     exit(0);  
  195. }  
  196.   
  197. void statusConnected()  
  198. {  
  199.     printMsg("\n\t请输入登录信息\n");  
  200.   
  201.     while (1)  
  202.     {  
  203.         printMsg("本机的QQ号(最多不超过5位数字):");  
  204.         char tmp[1024];  
  205.         scanf("%s", tmp);  
  206.         int  i;  
  207.         if (strlen(tmp)>5)  
  208.         {  
  209.             printMsg("您输入的qq号长度大于5个,请重新输入\n");  
  210.             continue;  
  211.         }  
  212.   
  213.         for (i = 0;i<strlen(tmp);i++)  
  214.         {  
  215.             if (tmp[i] >= '0' && tmp[i] <= '9')  
  216.             {  
  217.                 continue;  
  218.             }  
  219.             else  
  220.                 break;  
  221.         }  
  222.   
  223.         if (i == strlen(tmp))  
  224.         {  
  225.             strcpy(qq, tmp);  
  226.             break;  
  227.   
  228.         }  
  229.         else  
  230.         {  
  231.             printMsg("输入信息有误,请重新输入\n");  
  232.             continue;  
  233.         }  
  234.   
  235.     }  
  236.   
  237.     struct LoginMsg msg;  
  238.     msg.id = LOGIN_MSG;  
  239.     status = STUS_WAIT_LOGIN_RES;  
  240.     strcpy(msg.qq, qq);  
  241.     tcpSend(sock, (const char *)&msg, sizeof(msg));  
  242.     mainProc(); //进入主处理程序  
  243.     return;  
  244. }  
  245.   
  246. void procLoginMsgResponse(struct LoginMsgResponse *msg)  
  247. {  
  248.     if (msg->isOK == 1)  
  249.     {  
  250.         printMsg("登录成功!\n");  
  251.         status = STUS_LOGINED;//已登录状态  
  252.     }  
  253.     else  
  254.     {  
  255.         printMsg("登录失败!\n");  
  256.         printMsgExit(msg->reason);  
  257.         printf("\n");  
  258.     }  
  259. }  
  260.   
  261. void procFriendQqMsgResponse(struct FriendQqMsgResponse *msg)  
  262. {  
  263.     if (msg->isOK == 1)  
  264.     {  
  265.         printMsg("好友目前在线,可以开始聊天...\n");  
  266.         status = STUS_TALK;  
  267.     }  
  268.     else  
  269.     {  
  270.         printMsg("好友不存在啊,再换个人试试!\n");  
  271.         status = STUS_LOGINED;  
  272.     }  
  273. }  
  274.   
  275. void procTalkMsg(struct TalkMsg *msg)  
  276. {  
  277.     char buf[1024] = { 0 };  
  278.   
  279.     if (strcmp(msg->qq, fqq) == 0)  
  280.     {//表示是自己发起的聊天,仅仅显示信息即可  
  281.         printf("\n");  
  282.         sprintf(buf, "%s说>>%s", fqq, msg->info);  
  283.         printMsg(buf);  
  284.     }  
  285.     else  
  286.     {//是陌生人发起的聊天  
  287.         printf("\n");  
  288.         sprintf(buf, "%s说>>%s", msg->qq, msg->info);  
  289.         printMsg(buf);  
  290.     }  
  291. }  
  292.   
  293. void procApplyAllFriend(struct AllFriendMsg *msg)  
  294. {<pre name="code" class="html">#pragma once  
  295. /************************************************************  
  296. *  文件名:TalkClientService.h  
  297. *  描述:  客户端业务层函数声明  
  298. *************************************************************/  
  299. #ifndef _TALKCLIENTSERVICE_H_  
  300. #define _TALKCLIENTSERVICE_H_  
  301. #include <Windows.h>  
  302. #include <stdio.h>  
  303. #include <string.h>  
  304. #include <stdlib.h>  
  305. #include "MyMsg.h"  
  306.   
  307. void connectServer();  
  308. void procLoginMsgResponse(struct LoginMsgResponse *msg);  
  309. void procFriendQqMsgResponse(struct FriendQqMsgResponse *msg);  
  310. void procTalkMsg(struct TalkMsg *msg);  
  311. void statusConnected();  
  312. void statusLogined();  
  313. void statusTalk();  
  314. void procApplyAllFriend(struct AllFriendMsg *msg);  
  315.   
  316. /** 客户端状态 **/  
  317. enum {  
  318.     STUS_START,  
  319.     STUS_CONNECTED,  
  320.     STUS_WAIT_LOGIN_RES,  
  321.     STUS_LOGINED,  
  322.     STUS_WAIT_QUERY_FQQ_RES,  
  323.     STUS_TALK,  
  324.     STUS_WAIT_QUERY_ALLQQ_RES  
  325. };  
  326.   
  327. #endif  

char buf[100] = { 0 };sprintf(buf, "%s", msg->qq);printMsg("在线的QQ好友: \n");printMsg(buf);printf("\n");status = STUS_LOGINED;}
 
 

TalkClientService.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值