├── LICENSE ├── README.md └── 基于Linux系统下的CS聊天室程序 ├── Client ├── Makefile ├── cli.c ├── config.json ├── service │ ├── ACC_SRV.c │ ├── ACC_SRV.h │ ├── CHAT_SRV.c │ ├── CHAT_SRV.h │ ├── CONNECT.c │ ├── CONNECT.h │ ├── FRI_SRV.c │ ├── FRI_SRV.h │ ├── GROUP_SRV.c │ └── GROUP_SRV.h ├── src │ ├── Common.c │ ├── Common.h │ ├── JSON.c │ ├── JSON.h │ ├── List.h │ ├── decode.c │ ├── decode.h │ ├── encode.c │ └── encode.h └── ui │ ├── ACC_UI.c │ ├── ACC_UI.h │ ├── CHAT_UI.c │ ├── CHAT_UI.h │ ├── FRI_UI.c │ ├── FRI_UI.h │ ├── GROUP_UI.c │ ├── GROUP_UI.h │ ├── MAIN_UI.c │ └── MAIN_UI.h ├── Server ├── Makefile ├── chat_room.sql ├── config.json ├── service │ ├── ACC_SRV.c │ ├── ACC_SRV.h │ ├── CHAT_SRV.c │ ├── CHAT_SRV.h │ ├── CONNECT.c │ ├── CONNECT.h │ ├── FRI_SRV.c │ ├── FRI_SRV.h │ ├── GROUP_SRV.c │ └── GROUP_SRV.h ├── src │ ├── Common.c │ ├── Common.h │ ├── JSON.c │ ├── JSON.h │ └── List.h ├── srv.c └── srvv │ ├── ACC_PER.c │ ├── ACC_PER.h │ ├── CHAT_PER.c │ ├── CHAT_PER.h │ ├── FRI_PER.c │ ├── FRI_PER.h │ ├── GRO_PER.c │ ├── GRO_PER.h │ ├── MySQL.c │ └── MySQL.h ├── 其他小程序 ├── 测试截图 │ ├── 1-1.PNG │ ├── 1-2.PNG │ ├── 1-3.PNG │ ├── 1-4.PNG │ ├── 2-1.PNG │ ├── 2-2.PNG │ ├── 2-3.PNG │ ├── copy.PNG │ ├── easy_shell1.PNG │ ├── easy_shell2.PNG │ └── juzhen.PNG ├── 第一次平时作业 │ ├── 01.sh │ ├── 02.sh │ ├── 03.sh │ ├── 04.sh │ ├── 05.sh │ ├── b1.c │ ├── b2.h │ ├── b3.o │ ├── b4.so │ ├── dll.out │ ├── file │ ├── libb4.so │ ├── main.c │ └── nodll.out ├── 第三次平时作业 │ └── lab3.c └── 第二次平时作业 │ ├── 06.sh │ ├── 07.sh │ ├── 08-a.sh │ ├── copy.c │ └── juzhen.c └── 基于Linux系统下的CS聊天室程序.docx /README.md: -------------------------------------------------------------------------------- 1 | # C_Chat_Program 2 | 基于Linux系统下的聊天室程序-LINUX程序设计课程\n 3 | 程序运行结果可以看我的B站视频 https://www.bilibili.com/video/BV1Eg411T7cY 4 | -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/Makefile: -------------------------------------------------------------------------------- 1 | #!Makefile 2 | PROGRAM = cli 3 | vpath %.h ./src/ 4 | C_SOURCES = $(shell find . -name "*.c") 5 | C_OBJECTS = $(patsubst %.c, %.o, $(C_SOURCES)) 6 | CC = gcc 7 | C_FLAGS = -DDEBUG -c -Wall -Wextra -ggdb -ICommon/ 8 | all: $(C_OBJECTS) 9 | @echo link... 10 | $(CC) $(C_OBJECTS) -lm -lpthread -o $(PROGRAM) 11 | .c.o: 12 | @echo compile $< ... 13 | $(CC) $(C_FLAGS) $< -o $@ 14 | .PHONY:clean 15 | clean: 16 | $(RM) $(C_OBJECTS) cli -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/cli.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "src/JSON.h" 7 | #include "./ui/MAIN_UI.h" 8 | #include "./service/CONNECT.h" 9 | extern int sockfd; 10 | int gl_uid; 11 | int main() 12 | { 13 | char host[50]; 14 | char buf[1000]; 15 | int fd = open("config.json" ,O_RDONLY); 16 | if(fd == -1) 17 | { 18 | printf("打开配置文件失败!"); 19 | getchar(); 20 | exit(0); 21 | } 22 | read(fd ,buf ,1024); 23 | cJSON* root = JSON_Par(buf); 24 | cJSON* item = JSON_Get_Obj_Item(root ,"host"); 25 | strcpy(host ,item -> valuestring); 26 | item = JSON_Get_Obj_Item(root ,"port"); 27 | int port = item -> valueint; 28 | close(fd); 29 | JSON_shanchu(root); 30 | Connect(host ,port); 31 | Main_UI_Hello(); 32 | close(sockfd); 33 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "host": "127.0.0.1", 3 | "port": 1314 4 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/ACC_SRV.c: -------------------------------------------------------------------------------- 1 | #include "./CONNECT.h" 2 | #include "./FRI_SRV.h" 3 | #include "ACC_SRV.h" 4 | #include "../src/List.h" 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | extern char massage[1024]; 11 | extern friends_t *fri_list; 12 | extern int mutex_srv; 13 | extern int gl_uid; 14 | extern int sockfd; 15 | void Acc_Srv_Rec_Onl(char *JSON) 16 | { 17 | cJSON *root = JSON_Par(JSON); 18 | cJSON *item = JSON_Get_Obj_Item(root ,"is_online"); 19 | int is_online = item -> valueint; 20 | item = JSON_Get_Obj_Item(root ,"fuid"); 21 | int fuid = item -> valueint; 22 | friends_t *f; 23 | List_For_Each(fri_list ,f) 24 | { 25 | if(f -> uid == fuid) 26 | { 27 | f -> is_online = is_online; 28 | if(is_online) 29 | { 30 | printf("\n%s 已上线!\n" ,f -> name); 31 | } 32 | else 33 | { 34 | printf("\n%s 已下线!\n" ,f -> name); 35 | } 36 | } 37 | } 38 | } 39 | int Acc_Srv_Out(int uid) 40 | { 41 | int rtn; 42 | cJSON *root = JSON_Cre_Obj(); 43 | cJSON *item = JSON_Cre_Str("O"); 44 | JSON_Add_Item_To_Obj(root ,"type",item); 45 | item = JSON_Cre_Num(uid); 46 | JSON_Add_Item_To_Obj(root , "uid" ,item); 47 | char *out = JSON_prt(root); 48 | 49 | if(send(sockfd ,(void *)out ,1024 ,0) <= 0) 50 | { 51 | perror("发送请求服务器失败!"); 52 | rtn = 0; 53 | } 54 | gl_uid = 0; 55 | JSON_shanchu(root); 56 | free(out); 57 | cc_Lock(); 58 | root = JSON_Par(massage); 59 | item = JSON_Get_Obj_Item(root ,"res"); 60 | if(item -> valueint == 0) 61 | { 62 | item = JSON_Get_Obj_Item(root ,"reason"); 63 | printf("注销失败: %s",item -> valuestring); 64 | rtn = 0; 65 | } 66 | else 67 | { 68 | printf("注销成功,按任意键继续!"); 69 | rtn = 1; 70 | } 71 | JSON_shanchu(root); 72 | cc_Unlock(); 73 | getchar(); 74 | return rtn; 75 | } 76 | int Acc_Srv_sig(const char * name ,int sex ,const char * password) 77 | { 78 | int rtn; 79 | cJSON *root = JSON_Cre_Obj(); 80 | cJSON *item = JSON_Cre_Str("S"); 81 | JSON_Add_Item_To_Obj(root,"type",item); 82 | item = JSON_Cre_Str(name); 83 | JSON_Add_Item_To_Obj(root,"name",item); 84 | item = JSON_Cre_Bool(sex); 85 | JSON_Add_Item_To_Obj(root ,"sex" ,item); 86 | item = JSON_Cre_Str(password); 87 | JSON_Add_Item_To_Obj(root,"password",item); 88 | char *out = JSON_prt(root); 89 | 90 | if(send(sockfd , (void *)out , 1024 ,0) < 0 ) 91 | { 92 | perror("发送: 请求服务器失败"); 93 | return 0; 94 | } 95 | free(out); 96 | JSON_shanchu(root); 97 | cc_Lock(); 98 | root = JSON_Par(massage); 99 | item = JSON_Get_Obj_Item(root,"res"); 100 | int res = item -> valueint; 101 | if(res == 1) 102 | { 103 | printf("注册成功!按任意键继续!"); 104 | getchar(); 105 | rtn = 1; 106 | } 107 | else 108 | { 109 | item = JSON_Get_Obj_Item(root,"reason"); 110 | printf("注册失败: %s",item -> valuestring); 111 | getchar(); 112 | rtn = 0; 113 | } 114 | JSON_shanchu(root); 115 | cc_Unlock(); 116 | return rtn; 117 | } 118 | int Acc_Srv_Log(const char *name , const char *password) 119 | { 120 | int rtn; 121 | cJSON *root = JSON_Cre_Obj(); 122 | cJSON *item = JSON_Cre_Str("L"); 123 | JSON_Add_Item_To_Obj(root,"type",item); 124 | item = JSON_Cre_Str(name); 125 | JSON_Add_Item_To_Obj(root,"name",item); 126 | item = JSON_Cre_Str(password); 127 | JSON_Add_Item_To_Obj(root,"password",item); 128 | char *out = JSON_prt(root); 129 | 130 | if(send(sockfd , out , 1024 ,0) < 0 ) 131 | { 132 | perror("发送: 请求服务器失败!"); 133 | return 0; 134 | } 135 | free(out); 136 | cc_Lock(); 137 | JSON_shanchu(root); 138 | root = JSON_Par(massage); 139 | item = JSON_Get_Obj_Item(root,"res"); 140 | int res = item -> valueint; 141 | if(res == 1) 142 | { 143 | item = JSON_Get_Obj_Item(root,"uid"); 144 | rtn = item -> valueint; 145 | printf("登录成功!请稍候.."); 146 | fflush(stdout); 147 | sleep(2); 148 | } 149 | else 150 | { 151 | item = JSON_Get_Obj_Item(root,"reason"); 152 | rtn = 0; 153 | printf("登录失败: %s",item -> valuestring); 154 | getchar(); 155 | } 156 | JSON_shanchu(root); 157 | cc_Unlock(); 158 | return rtn; 159 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/ACC_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _ACCOUNT_SRV_H 2 | #define _ACCOUNT_SRV_H 3 | #include "CONNECT.h" 4 | #include "../src/JSON.h" 5 | void Acc_Srv_Rec_Onl(char *cJSON); 6 | int Acc_Srv_Out(int uid); 7 | int Acc_Srv_sig(const char *name , int sex ,const char *password); 8 | int Acc_Srv_Log(const char *name , const char *password); 9 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/CHAT_SRV.c: -------------------------------------------------------------------------------- 1 | #include"../service/FRI_SRV.h" 2 | #include"../service/GROUP_SRV.h" 3 | #include"../src/JSON.h" 4 | #include"./CHAT_SRV.h" 5 | #include"../src/List.h" 6 | #include"./CONNECT.h" 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #define MSG_LEN 1024 13 | extern int gl_uid; 14 | extern int sockfd; 15 | extern friends_t *fri_list; 16 | extern group_t *group_list; 17 | private_msg_t *Pri_msg_list; 18 | group_msg_t *group_msg_list; 19 | int Chat_Srv_Rec_File(const char *JSON) 20 | { 21 | char output_cod[650] ,buf[900]; 22 | memset(buf ,0,sizeof(buf)); 23 | char filename [100] = "download/"; 24 | cJSON *root = JSON_Par(JSON); 25 | cJSON *item = JSON_Get_Obj_Item(root ,"filename"); 26 | strcat(filename , item->valuestring); 27 | int fd = open(filename ,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR); 28 | if(fd == -1) 29 | { 30 | perror("open"); 31 | return 0; 32 | } 33 | item = JSON_Get_Obj_Item(root ,"con"); 34 | strcat( buf , item -> valuestring); 35 | item = JSON_Get_Obj_Item(root ,"size"); 36 | int size = item -> valueint; 37 | W64jiema input_sta; 38 | chushihua(&input_sta); 39 | jiemakuai(buf ,strlen(buf) ,output_cod ,&input_sta); 40 | if(write(fd,output_cod ,size) != size) 41 | { 42 | perror("write"); 43 | close(fd); 44 | return 0; 45 | } 46 | if(size < 650 - 2) 47 | { 48 | item = JSON_Get_Obj_Item(root ,"uid"); 49 | int uid = item -> valueint; 50 | friends_t *f; 51 | List_For_Each(fri_list ,f) 52 | { 53 | if(f -> uid == uid) 54 | { 55 | printf("\n%s 发来一个文件,已保存至./download/%s\n",f->name ,basename(filename)); 56 | break; 57 | } 58 | } 59 | } 60 | close(fd); 61 | return 0; 62 | } 63 | int Chat_Srv_Send_File(const char *filename ,int fuid) 64 | { 65 | char buf[650] ,output_cod[900] ,code_end[5],*out; 66 | int fd ,size; 67 | W64bianmazhuangtai input_sta; 68 | if((fd = open(filename ,O_RDONLY)) == -1) 69 | { 70 | printf("读取权限不够or文件不存在!"); 71 | return 0; 72 | } 73 | while(1) 74 | { 75 | memset(buf ,0,sizeof(buf)); 76 | size = read(fd ,buf ,sizeof(buf) - 2); 77 | chushihua2(&input_sta); 78 | memset(output_cod ,0,sizeof(output_cod)); 79 | bianmakuai(buf ,size ,output_cod ,&input_sta); 80 | if(input_sta.step != step_a) 81 | { 82 | memset(code_end ,0,sizeof(code_end)); 83 | bianmakuai2(code_end ,&input_sta); 84 | strcat(output_cod ,code_end); 85 | } 86 | cJSON *root = JSON_Cre_Obj(); 87 | cJSON *item = JSON_Cre_Str("F"); 88 | JSON_Add_Item_To_Obj(root ,"type" ,item); 89 | item = JSON_Cre_Num(gl_uid); 90 | JSON_Add_Item_To_Obj(root ,"uid",item); 91 | item = JSON_Cre_Num(fuid); 92 | JSON_Add_Item_To_Obj(root ,"fuid" ,item); 93 | item = JSON_Cre_Str(basename((char*)filename)); 94 | JSON_Add_Item_To_Obj(root ,"filename" ,item); 95 | item = JSON_Cre_Num(size); 96 | JSON_Add_Item_To_Obj(root ,"size" ,item); 97 | item = JSON_Cre_Str(output_cod); 98 | JSON_Add_Item_To_Obj(root ,"con",item); 99 | out = JSON_prt(root); 100 | JSON_shanchu(root); 101 | int ret; 102 | printf("%s\n",out); 103 | if((ret = send(sockfd ,out,MSG_LEN ,0)) <= 0) 104 | { 105 | perror("send"); 106 | free(out); 107 | return 0; 108 | } 109 | if(size < (int)sizeof(buf) - 2) 110 | { 111 | break; 112 | } 113 | free(out); 114 | } 115 | close(fd); 116 | return 1; 117 | } 118 | void Chat_Srv_Init_List() 119 | { 120 | List_Init(Pri_msg_list ,private_msg_t); 121 | List_Init(group_msg_list ,group_msg_t); 122 | } 123 | void Chat_Srv_Rec_Priva(const char *JSON) 124 | { 125 | private_msg_t *NewMsg = (private_msg_t *)malloc(sizeof(private_msg_t)); 126 | cJSON *root = JSON_Par(JSON); 127 | cJSON *item = JSON_Get_Obj_Item(root ,"from_uid"); 128 | NewMsg->from_uid = item -> valueint; 129 | item = JSON_Get_Obj_Item(root ,"msg"); 130 | strcpy(NewMsg->msg , item -> valuestring); 131 | item = JSON_Get_Obj_Item(root ,"time"); 132 | strcpy(NewMsg->time , item -> valuestring); 133 | friends_t * f; 134 | List_For_Each(fri_list ,f) 135 | { 136 | if(f->uid == NewMsg->from_uid) 137 | { 138 | strcpy(NewMsg->name ,f->name); 139 | (f->NewMsgNum) ++; 140 | } 141 | } 142 | NewMsg->next =NULL; 143 | JSON_shanchu(root); 144 | private_msg_t *cur_Pos; 145 | List_AddTail(Pri_msg_list ,cur_Pos ,NewMsg); 146 | printf("\n%s 发来一条消息!\n",NewMsg->name); 147 | } 148 | 149 | void Chat_Srv_Rec_Group(const char *JSON) 150 | { 151 | group_msg_t *NewMsg = (group_msg_t *)malloc(sizeof(group_msg_t)); 152 | cJSON *root = JSON_Par(JSON); 153 | cJSON *item = JSON_Get_Obj_Item(root ,"from_uid"); 154 | NewMsg->from_uid = item -> valueint; 155 | item = JSON_Get_Obj_Item(root ,"to_gid"); 156 | NewMsg -> gid = item -> valueint; 157 | item = JSON_Get_Obj_Item(root ,"msg"); 158 | strcpy(NewMsg->msg , item -> valuestring); 159 | item = JSON_Get_Obj_Item(root ,"time"); 160 | strcpy(NewMsg->time , item -> valuestring); 161 | item = JSON_Get_Obj_Item(root,"uname"); 162 | strcpy(NewMsg -> uname ,item -> valuestring); 163 | group_t * g; 164 | List_For_Each(group_list ,g) 165 | { 166 | if(g->gid == NewMsg->gid) 167 | { 168 | strcpy(NewMsg->gname ,g->name); 169 | (g->NewMsgNum) ++; 170 | } 171 | } 172 | NewMsg->next =NULL; 173 | JSON_shanchu(root); 174 | group_msg_t *cur_Pos; 175 | List_AddTail(group_msg_list ,cur_Pos ,NewMsg); 176 | printf("\n你的群聊 %s 发来了一条新消息!\n",NewMsg->gname); 177 | } 178 | int Chat_Srv_Send_Priva(int to_uid ,const char * msg) 179 | { 180 | int rtn = 1; 181 | private_msg_t *NewMsg = (private_msg_t *)malloc(sizeof(private_msg_t)); 182 | user_date_t Srvdate = DateNow(); 183 | user_time_t Srvtime = TimeNow(); 184 | char Srvdatetime[25]; 185 | sprintf(Srvdatetime ,"%04d-%02d-%02d %02d:%02d:%02d",Srvdate.year ,Srvdate.month ,Srvdate.day,Srvtime.hour ,Srvtime.minute ,Srvtime.second); 186 | strcpy(NewMsg->time ,Srvdatetime); 187 | NewMsg->from_uid = gl_uid; 188 | strcpy(NewMsg->msg ,msg); 189 | NewMsg -> next = NULL; 190 | private_msg_t *m; 191 | List_AddTail(Pri_msg_list ,m ,NewMsg); 192 | cJSON *root = JSON_Cre_Obj(); 193 | cJSON *item = JSON_Cre_Str("P"); 194 | JSON_Add_Item_To_Obj(root ,"type" ,item); 195 | item = JSON_Cre_Num(gl_uid); 196 | JSON_Add_Item_To_Obj(root ,"from_uid" ,item); 197 | item = JSON_Cre_Num(to_uid); 198 | JSON_Add_Item_To_Obj(root ,"to_uid" ,item); 199 | item = JSON_Cre_Str(msg); 200 | JSON_Add_Item_To_Obj(root ,"msg" ,item); 201 | char *out = JSON_prt(root); 202 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) <= 0) 203 | { 204 | printf("服务器失去响应!\n"); 205 | rtn = 0; 206 | } 207 | JSON_shanchu(root); 208 | free(out); 209 | return rtn; 210 | } 211 | int Chat_Srv_Send_Group(int to_gid ,const char * msg) 212 | { 213 | int rtn = 1; 214 | group_msg_t *NewMsg = (group_msg_t *)malloc(sizeof(group_msg_t)); 215 | NewMsg -> gid = to_gid; 216 | user_date_t Srvdate = DateNow(); 217 | user_time_t Srvtime = TimeNow(); 218 | char Srvdatetime[25]; 219 | sprintf(Srvdatetime ,"%04d-%02d-%02d %02d:%02d:%02d",Srvdate.year ,Srvdate.month ,Srvdate.day,Srvtime.hour ,Srvtime.minute ,Srvtime.second); 220 | strcpy(NewMsg->time ,Srvdatetime); 221 | NewMsg->from_uid = gl_uid; 222 | strcpy(NewMsg->msg ,msg); 223 | NewMsg -> next = NULL; 224 | group_msg_t *m; 225 | List_AddTail(group_msg_list ,m ,NewMsg); 226 | cJSON *root = JSON_Cre_Obj(); 227 | cJSON *item = JSON_Cre_Str("p"); 228 | JSON_Add_Item_To_Obj(root ,"type" ,item); 229 | item = JSON_Cre_Num(gl_uid); 230 | JSON_Add_Item_To_Obj(root ,"from_uid" ,item); 231 | item = JSON_Cre_Num(to_gid); 232 | JSON_Add_Item_To_Obj(root ,"to_gid" ,item); 233 | item = JSON_Cre_Str(msg); 234 | JSON_Add_Item_To_Obj(root ,"msg" ,item); 235 | char *out = JSON_prt(root); 236 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) <= 0) 237 | { 238 | printf("服务器失去响应!\n"); 239 | rtn = 0; 240 | } 241 | JSON_shanchu(root); 242 | free(out); 243 | return rtn; 244 | } 245 | void Chat_Srv_Show_Priva_Rec2(const char *JSON) 246 | { 247 | private_msg_t *NewMsg = (private_msg_t *)malloc(sizeof(private_msg_t)); 248 | cJSON *root = JSON_Par(JSON); 249 | cJSON *item = JSON_Get_Obj_Item(root ,"from_uid"); 250 | NewMsg->from_uid = item -> valueint; 251 | item = JSON_Get_Obj_Item(root ,"msg"); 252 | strcpy(NewMsg->msg , item -> valuestring); 253 | item = JSON_Get_Obj_Item(root ,"time"); 254 | strcpy(NewMsg->time , item -> valuestring); 255 | friends_t * f; 256 | List_For_Each(fri_list ,f) 257 | { 258 | if(f->uid == NewMsg->from_uid) 259 | { 260 | strcpy(NewMsg->name ,f->name); 261 | (f->NewMsgNum) ++; 262 | } 263 | } 264 | NewMsg->next =NULL; 265 | JSON_shanchu(root); 266 | if(NewMsg -> from_uid == gl_uid) 267 | { 268 | printf("\t\e[32m%s\e[0m ",NewMsg->time); 269 | printf("本人\n"); 270 | printf("\t \e[1m%s\e[0m\n",NewMsg -> msg); 271 | } 272 | else 273 | { 274 | printf("\t\e[31m%s\e[0m ",NewMsg->time); 275 | printf("%s\n",NewMsg -> name); 276 | printf("\t \e[1m%s\e[0m\n",NewMsg -> msg); 277 | } 278 | } 279 | void Chat_Srv_Get_Priva_Rec(int fuid) 280 | { 281 | cJSON *root = JSON_Cre_Obj(); 282 | cJSON_AddStringToObject(root ,"type" ,"E"); 283 | cJSON_AddNumberToObject(root ,"uid" ,gl_uid); 284 | cJSON_AddNumberToObject(root ,"fuid" ,fuid); 285 | char *out = JSON_prt(root); 286 | JSON_shanchu(root); 287 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) <= 0) 288 | { 289 | printf("服务器失去响应!\n"); 290 | } 291 | free(out); 292 | system("clear"); 293 | sleep(1); 294 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/CHAT_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _CHAT_SRV_H 2 | #define _CHAT_SRV_H 3 | #include "../src/Common.h" 4 | typedef struct private_msg 5 | { 6 | int from_uid; 7 | char name[30]; 8 | char msg[1000]; 9 | char time [25]; 10 | struct private_msg *next; 11 | }private_msg_t; 12 | typedef struct group_msg 13 | { 14 | int from_uid; 15 | int gid; 16 | char uname[30]; 17 | char gname[30]; 18 | char msg[1000]; 19 | char time [25]; 20 | struct group_msg *next; 21 | }group_msg_t; 22 | void Chat_Srv_Init_List(); 23 | void Chat_Srv_Rec_Priva(const char *cJSON); 24 | int Chat_Srv_Send_Priva(int to_uid ,const char *msg); 25 | void Chat_Srv_Rec_Group(const char *cJSON); 26 | int Chat_Srv_Send_Group(int to_uid ,const char *msg); 27 | int Chat_Srv_Send_File(const char *filename ,int fuid); 28 | int Chat_Srv_Rec_File(const char *cJSON); 29 | void Chat_Srv_Show_Priva_Rec2(const char *cJSON); 30 | void Chat_Srv_Get_Priva_Rec(int fuid); 31 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/CONNECT.c: -------------------------------------------------------------------------------- 1 | #include "./GROUP_SRV.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "./ACC_SRV.h" 9 | #include "./CHAT_SRV.h" 10 | #include "./CONNECT.h" 11 | #include "./FRI_SRV.h" 12 | #include "../src/JSON.h" 13 | #define MSG_LEN 1024 14 | int sockfd; 15 | extern int mutex_srv; 16 | char massage[MSG_LEN]; 17 | void * thread(void *arg) 18 | { 19 | int ret ,recv_len; 20 | cJSON *root ,*item; 21 | if(arg == NULL) 22 | { 23 | arg = NULL; 24 | } 25 | while(1) 26 | { 27 | if(mutex_srv) 28 | { 29 | continue; 30 | } 31 | recv_len = 0; 32 | while(recv_len < MSG_LEN) 33 | { 34 | ret = 0; 35 | if((ret = recv(sockfd ,massage + recv_len ,MSG_LEN - recv_len,0)) <= 0) 36 | { 37 | perror("接受: 服务器失去响应!"); 38 | exit(0); 39 | } 40 | recv_len += ret; 41 | } 42 | root = JSON_Par(massage); 43 | item = JSON_Get_Obj_Item(root ,"type"); 44 | switch(item -> valuestring[0]) 45 | { 46 | case 'A' : 47 | Friends_Srv_Recv_Add(massage); 48 | break; 49 | case 'a' : 50 | Friends_Srv_App_Res(massage); 51 | break; 52 | case 'P' : 53 | Chat_Srv_Rec_Priva(massage); 54 | break; 55 | case 'p': 56 | Chat_Srv_Rec_Group(massage); 57 | break; 58 | case 'F' : 59 | Chat_Srv_Rec_File(massage); 60 | break; 61 | case 'Q' : 62 | break; 63 | case 'R' : 64 | mutex_srv = 1; 65 | break; 66 | case 'L' : 67 | mutex_srv = 1; 68 | break; 69 | case 'l' : 70 | mutex_srv = 1; 71 | break; 72 | case 'I' : 73 | Acc_Srv_Rec_Onl(massage); 74 | break; 75 | case 'J' : 76 | Group_Srv_Join(massage); 77 | break; 78 | case 'm' : 79 | Gro_Srv_Show_Mem(massage); 80 | break; 81 | case 'D' : 82 | Group_Srv_Del(massage); 83 | break; 84 | case 'E' : 85 | Chat_Srv_Show_Priva_Rec2(massage); 86 | break; 87 | } 88 | } 89 | return NULL; 90 | } 91 | void Connect(const char *host ,int port) 92 | { 93 | struct sockaddr_in clie_addr; 94 | pthread_t thid; 95 | memset(&clie_addr , 0 ,sizeof(struct sockaddr_in)); 96 | clie_addr.sin_family = AF_INET; 97 | clie_addr.sin_port = htons(port); 98 | clie_addr.sin_addr.s_addr = inet_addr(host); 99 | sockfd = socket(AF_INET , SOCK_STREAM , 0); 100 | if(sockfd < 0) 101 | { 102 | perror("socket"); 103 | exit(0); 104 | } 105 | if(connect(sockfd , (struct sockaddr *)&clie_addr,sizeof(struct sockaddr_in)) < 0) 106 | { 107 | perror("connect"); 108 | exit(0); 109 | } 110 | pthread_create(&thid ,NULL ,thread ,NULL); 111 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/CONNECT.h: -------------------------------------------------------------------------------- 1 | #ifndef _CONNECT_H 2 | #define _CONNECT_H 3 | #include "../src/Common.h" 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | void Connect(const char *host ,int port); 10 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/FRI_SRV.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include"../src/List.h" 5 | #include"./FRI_SRV.h" 6 | #include"./CONNECT.h" 7 | #include 8 | #include"../src/Common.h" 9 | #define MSG_LEN 1024 10 | extern int gl_uid; 11 | extern int sockfd; 12 | extern int mutex_srv; 13 | extern char massage[1024]; 14 | friends_t *fri_list; 15 | int Fri_Srv_Get_List() 16 | { 17 | int rtn; 18 | if(NULL != fri_list) 19 | { 20 | List_Destroy(fri_list ,friends_t); 21 | } 22 | List_Init(fri_list ,friends_t); 23 | cJSON *root = JSON_Cre_Obj(); 24 | cJSON *item = JSON_Cre_Str("G"); 25 | JSON_Add_Item_To_Obj(root ,"type" ,item); 26 | item = JSON_Cre_Num(gl_uid); 27 | JSON_Add_Item_To_Obj(root, "uid" ,item); 28 | char *out = JSON_prt(root); 29 | if(send(sockfd ,(void *)out ,MSG_LEN,0) < 0) 30 | { 31 | perror("发送: 请求服务器失败!"); 32 | return 0; 33 | } 34 | free(out); 35 | JSON_shanchu(root); 36 | friends_t *newNode = NULL; 37 | while(1) 38 | { 39 | cc_Lock(); 40 | root = JSON_Par(massage); 41 | item = JSON_Get_Obj_Item(root ,"uid"); 42 | if( item -> valueint == 0) 43 | { 44 | cc_Unlock(); 45 | break; 46 | } 47 | newNode = (friends_t *)malloc(sizeof(friends_t)); 48 | newNode -> uid = item -> valueint; 49 | item = JSON_Get_Obj_Item(root ,"name"); 50 | strcpy(newNode -> name ,item -> valuestring); 51 | item = JSON_Get_Obj_Item(root ,"sex"); 52 | newNode -> sex = item -> valueint; 53 | item = JSON_Get_Obj_Item(root ,"is_vip"); 54 | newNode -> is_vip = item -> valueint; 55 | item = JSON_Get_Obj_Item(root ,"is_follow"); 56 | newNode -> is_follow = item -> valueint; 57 | item = JSON_Get_Obj_Item(root ,"is_online"); 58 | newNode -> is_online = item -> valueint; 59 | item = JSON_Get_Obj_Item(root ,"state"); 60 | newNode -> state = item -> valueint; 61 | JSON_shanchu(root); 62 | newNode -> NewMsgNum = 0; 63 | newNode -> next = NULL; 64 | List_AddHead(fri_list ,newNode); 65 | cc_Unlock(); 66 | } 67 | cc_Lock(); 68 | root = JSON_Par(massage); 69 | item = JSON_Get_Obj_Item(root,"res"); 70 | int res = item -> valueint; 71 | if(res == 1) 72 | { 73 | rtn = 1; 74 | } 75 | else 76 | { 77 | item = JSON_Get_Obj_Item(root ,"reason"); 78 | printf("请求失败: %s",item -> valuestring); 79 | rtn = 0; 80 | } 81 | JSON_shanchu(root); 82 | cc_Unlock(); 83 | return rtn; 84 | } 85 | int Fri_Srv_Send_Add(const char *fname) 86 | { 87 | int rtn; 88 | cJSON *root = JSON_Cre_Obj(); 89 | cJSON *item = JSON_Cre_Str("A"); 90 | JSON_Add_Item_To_Obj(root ,"type" ,item); 91 | item = JSON_Cre_Num(gl_uid); 92 | JSON_Add_Item_To_Obj(root, "uid" ,item); 93 | item = JSON_Cre_Str(fname); 94 | JSON_Add_Item_To_Obj(root ,"fname" ,item); 95 | char *out = JSON_prt(root); 96 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) < 0) 97 | { 98 | perror("发送: 请求服务器失败!"); 99 | return 0; 100 | } 101 | free(out); 102 | JSON_shanchu(root); 103 | cc_Lock(); 104 | root = JSON_Par(massage); 105 | item = JSON_Get_Obj_Item(root,"res"); 106 | int res = item -> valueint; 107 | if(res) 108 | { 109 | printf("好友请求发送成功!"); 110 | getchar(); 111 | rtn = 1; 112 | } 113 | else 114 | { 115 | item = JSON_Get_Obj_Item(root ,"reason"); 116 | printf("请求失败: %s",item -> valuestring); 117 | getchar(); 118 | rtn = 0; 119 | } 120 | JSON_shanchu(root); 121 | cc_Unlock(); 122 | return rtn; 123 | } 124 | int Friends_Srv_Recv_Add(const char *JSON) 125 | { 126 | friends_t *newNode; 127 | newNode = (friends_t *)malloc(sizeof(friends_t)); 128 | cJSON *root = JSON_Par(JSON); 129 | cJSON *item = JSON_Get_Obj_Item(root ,"uid"); 130 | newNode -> uid = item -> valueint; 131 | item = JSON_Get_Obj_Item(root ,"name"); 132 | strcpy(newNode -> name ,item -> valuestring); 133 | item = JSON_Get_Obj_Item(root ,"sex"); 134 | newNode -> sex = item -> valueint; 135 | item = JSON_Get_Obj_Item(root ,"is_vip"); 136 | newNode -> is_vip = item -> valueint; 137 | item = JSON_Get_Obj_Item(root ,"is_follow"); 138 | newNode -> is_follow = item -> valueint; 139 | item = JSON_Get_Obj_Item(root ,"is_online"); 140 | newNode -> is_online = item -> valueint; 141 | item = JSON_Get_Obj_Item(root ,"state"); 142 | newNode -> state = item -> valueint; 143 | JSON_shanchu(root); 144 | newNode -> NewMsgNum = 0; 145 | newNode -> next = NULL; 146 | List_AddHead(fri_list ,newNode); 147 | if(newNode -> state == 0) 148 | { 149 | printf("\n%s请求添加你为好友!\n",newNode -> name); 150 | } 151 | return 1; 152 | } 153 | int Fri_Srv_App(int uid ,int fuid ,int is_agree) 154 | { 155 | cJSON * root = JSON_Cre_Obj(); 156 | cJSON * item = JSON_Cre_Str("a"); 157 | JSON_Add_Item_To_Obj(root ,"type",item); 158 | item = JSON_Cre_Num(uid); 159 | JSON_Add_Item_To_Obj(root ,"uid" ,item); 160 | item = JSON_Cre_Num(fuid); 161 | JSON_Add_Item_To_Obj(root ,"fuid" ,item); 162 | item = JSON_Cre_Bool(is_agree); 163 | JSON_Add_Item_To_Obj(root ,"is_agree" ,item); 164 | char *out = JSON_prt(root); 165 | JSON_shanchu(root); 166 | if(send(sockfd ,(void *)out ,MSG_LEN,0) <= 0 ) 167 | { 168 | perror("send"); 169 | return 0; 170 | } 171 | free(out); 172 | return 1; 173 | } 174 | int Friends_Srv_App_Res(const char *JSON) 175 | { 176 | cJSON *root = JSON_Par(JSON); 177 | cJSON *item = JSON_Get_Obj_Item(root,"fuid"); 178 | if(NULL == item) 179 | { 180 | item = JSON_Get_Obj_Item(root ,"name"); 181 | printf("\n%s 同意了你的好友请求!\n",item -> valuestring); 182 | Friends_Srv_Recv_Add(JSON); 183 | JSON_shanchu(root); 184 | return 1; 185 | } 186 | item = JSON_Get_Obj_Item(root ,"fname"); 187 | printf("%s\n",JSON); 188 | printf("\n%s 拒绝了你的好友请求!\n",item -> valuestring); 189 | JSON_shanchu(root); 190 | return 1; 191 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/FRI_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _FRIENDS_SRV_H 2 | #define _FRIENDS_SRV_H 3 | #include "../src/List.h" 4 | #include "../src/JSON.h" 5 | #include "./CONNECT.h" 6 | typedef struct friends 7 | { 8 | int uid; 9 | char name[30]; 10 | int sex; 11 | int is_vip; 12 | int is_online; 13 | int is_follow; 14 | int state; 15 | int NewMsgNum; 16 | struct friends *next; 17 | } friends_t; 18 | int Fri_Srv_Send_Add(const char *fname); 19 | int Friends_Srv_Recv_Add(const char *cJSON); 20 | int Fri_Srv_Get_List(); 21 | int Fri_Srv_App(int uid ,int fuid ,int is_agree); 22 | int Friends_Srv_App_Res(const char *cJSON); 23 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/GROUP_SRV.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include"../src/JSON.h" 7 | #include"../src/Common.h" 8 | #include"./GROUP_SRV.h" 9 | #include"../src/List.h" 10 | #include"./FRI_SRV.h" 11 | #define MSG_LEN 1024 12 | extern int gl_uid; 13 | extern int sockfd; 14 | extern int mutex_srv; 15 | extern char massage[1024]; 16 | extern friends_t *fri_list; 17 | extern group_t *curGroup; 18 | group_t *group_list; 19 | int Gro_Srv_Cre(const char *gname) 20 | { 21 | int rtn = 0; 22 | cJSON *root = JSON_Cre_Obj(); 23 | cJSON *item = JSON_Cre_Str("c"); 24 | JSON_Add_Item_To_Obj(root ,"type" ,item); 25 | item = JSON_Cre_Str(gname); 26 | JSON_Add_Item_To_Obj(root ,"gname",item); 27 | item = JSON_Cre_Num(gl_uid); 28 | JSON_Add_Item_To_Obj(root, "uid" ,item); 29 | char *out = JSON_prt(root); 30 | JSON_shanchu(root); 31 | 32 | if(send(sockfd ,out ,MSG_LEN ,0) <= 0) 33 | { 34 | free(out); 35 | perror("send"); 36 | return 0; 37 | } 38 | free(out); 39 | cc_Lock(); 40 | root = JSON_Par(massage); 41 | item = JSON_Get_Obj_Item(root ,"res"); 42 | int res = item -> valueint; 43 | if(res) 44 | { 45 | printf("群创建成功!"); 46 | getchar(); 47 | rtn = 1; 48 | } 49 | else 50 | { 51 | item = JSON_Get_Obj_Item(root ,"reason"); 52 | printf("创建失败 :%s ",item -> valuestring); 53 | getchar(); 54 | rtn = 0; 55 | } 56 | JSON_shanchu(root); 57 | cc_Unlock(); 58 | return rtn; 59 | } 60 | int Gro_Srv_Get_List() 61 | { 62 | int rtn; 63 | if(NULL != group_list) 64 | { 65 | List_Destroy(group_list ,group_t); 66 | } 67 | List_Init(group_list ,group_t); 68 | cJSON *root = JSON_Cre_Obj(); 69 | cJSON *item = JSON_Cre_Str("g"); 70 | JSON_Add_Item_To_Obj(root ,"type" ,item); 71 | item = JSON_Cre_Num(gl_uid); 72 | JSON_Add_Item_To_Obj(root, "uid" ,item); 73 | char *out = JSON_prt(root); 74 | if(send(sockfd ,(void *)out ,MSG_LEN,0) < 0) 75 | { 76 | perror("send: 请求服务器失败!"); 77 | return 0; 78 | } 79 | free(out); 80 | JSON_shanchu(root); 81 | group_t *newNode = NULL; 82 | while(1) 83 | { 84 | cc_Lock(); 85 | root = JSON_Par(massage); 86 | item = JSON_Get_Obj_Item(root ,"gid"); 87 | 88 | if( item -> valueint == 0) 89 | { 90 | cc_Unlock(); 91 | break; 92 | } 93 | newNode = (group_t *)malloc(sizeof(group_t)); 94 | newNode -> gid = item -> valueint; 95 | item = JSON_Get_Obj_Item(root ,"name"); 96 | strcpy(newNode -> name ,item -> valuestring); 97 | item = JSON_Get_Obj_Item(root ,"owner"); 98 | newNode -> owner = item -> valueint; 99 | item = JSON_Get_Obj_Item(root ,"num"); 100 | newNode -> num = item -> valueint; 101 | JSON_shanchu(root); 102 | newNode -> next = NULL; 103 | List_AddHead(group_list ,newNode); 104 | cc_Unlock(); 105 | } 106 | cc_Lock(); 107 | root = JSON_Par(massage); 108 | item = JSON_Get_Obj_Item(root,"res"); 109 | int res = item -> valueint; 110 | if(res == 1) 111 | { 112 | rtn = 1; 113 | } 114 | else 115 | { 116 | item = JSON_Get_Obj_Item(root ,"reason"); 117 | printf("请求失败: %s",item -> valuestring); 118 | rtn = 0; 119 | } 120 | JSON_shanchu(root); 121 | cc_Unlock(); 122 | return rtn; 123 | } 124 | int Gro_Srv_Add_Mem(int gid ,int uid) 125 | { 126 | cJSON *root = JSON_Cre_Obj(); 127 | cJSON *item = JSON_Cre_Str("M"); 128 | JSON_Add_Item_To_Obj(root ,"type" ,item); 129 | item = JSON_Cre_Num(gid); 130 | JSON_Add_Item_To_Obj(root ,"gid",item); 131 | item = JSON_Cre_Num(uid); 132 | JSON_Add_Item_To_Obj(root , "uid" ,item); 133 | char *out = JSON_prt(root); 134 | JSON_shanchu(root); 135 | if(send(sockfd ,out ,MSG_LEN ,0) <= 0) 136 | { 137 | free(out); 138 | perror("send"); 139 | return 0; 140 | } 141 | free(out); 142 | cc_Lock(); 143 | root = JSON_Par(massage); 144 | item = JSON_Get_Obj_Item(root ,"res"); 145 | int res = item -> valueint; 146 | if(res) 147 | { 148 | printf("邀请成功!"); 149 | getchar(); 150 | } 151 | else 152 | { 153 | printf("邀请失败,该成员已在当前群聊中!"); 154 | getchar(); 155 | } 156 | JSON_shanchu(root); 157 | cc_Unlock(); 158 | return 1; 159 | } 160 | void Group_Srv_Join(const char * massage) 161 | { 162 | group_t *newNode = (group_t *)malloc(sizeof(group_t)); 163 | cJSON *root = JSON_Par(massage); 164 | cJSON *item = JSON_Get_Obj_Item(root,"gid"); 165 | newNode -> gid = item -> valueint; 166 | item = JSON_Get_Obj_Item(root ,"name"); 167 | strcpy(newNode -> name ,item -> valuestring); 168 | item = JSON_Get_Obj_Item(root ,"owner"); 169 | newNode -> owner = item -> valueint; 170 | item = JSON_Get_Obj_Item(root ,"num"); 171 | newNode -> num = item -> valueint; 172 | newNode -> NewMsgNum = 0; 173 | newNode -> next = NULL; 174 | List_AddHead(group_list ,newNode); 175 | if(newNode -> owner == gl_uid) 176 | { 177 | return; 178 | } 179 | friends_t *f; 180 | List_For_Each(fri_list ,f) 181 | { 182 | if(newNode -> owner == f -> uid) 183 | { 184 | printf("\n%s 邀请你加入了群聊! %s\n",f -> name ,newNode -> name); 185 | return; 186 | } 187 | } 188 | } 189 | void Gro_Srv_Show_Mem(const char *massage) 190 | { 191 | cJSON *root ,*item; 192 | friends_t GroupMember; 193 | root = JSON_Par(massage); 194 | item = JSON_Get_Obj_Item(root ,"name"); 195 | strcpy(GroupMember.name ,item -> valuestring); 196 | item = JSON_Get_Obj_Item(root ,"sex"); 197 | GroupMember.sex = item -> valueint; 198 | item = JSON_Get_Obj_Item(root ,"is_online"); 199 | GroupMember.is_online = item -> valueint; 200 | item = JSON_Get_Obj_Item(root ,"is_vip"); 201 | GroupMember.is_vip = item -> valueint; 202 | item = JSON_Get_Obj_Item(root ,"permission"); 203 | char *is_online[2] = {"@","\e[32m@\e[0m"};//qw 204 | char *is_vip[2] = {"","\e[31m"}; 205 | char *sex[2] = {"\e[35m女\e[0m","\e[36m男\e[0m"};//qw 206 | char *per[3] ={"" ,"[\e[32m管理员\e[0m]" ,"[\e[33m群主\e[0m]"}; 207 | printf(" %s %s%s\e[0m %s %s\n" ,is_online[GroupMember.is_online] ,is_vip[GroupMember.is_vip],GroupMember.name ,sex[GroupMember.sex],per[item -> valueint]); 208 | JSON_shanchu(root); 209 | } 210 | void Group_Srv_Get_Member(int gid) 211 | { 212 | cJSON *root = JSON_Cre_Obj(); 213 | cJSON_AddStringToObject(root ,"type" ,"m"); 214 | cJSON_AddNumberToObject(root ,"gid" ,gid); 215 | char * out = JSON_prt(root); 216 | JSON_shanchu(root); 217 | if(send(sockfd ,out ,MSG_LEN ,0) <= 0) 218 | { 219 | perror("send"); 220 | } 221 | free(out); 222 | } 223 | void Gro_Srv_Quit(group_t *curGroup) 224 | { 225 | char choice[5]; 226 | cJSON *root = JSON_Cre_Obj(); 227 | cJSON_AddStringToObject(root ,"type" ,"Q"); 228 | cJSON_AddNumberToObject(root ,"gid" ,curGroup -> gid); 229 | if(curGroup -> owner == gl_uid) 230 | { 231 | cJSON_AddStringToObject(root ,"do" ,"解散"); 232 | printf("确认解散群聊 %s ?[yes/no]", curGroup -> name); 233 | } 234 | else 235 | { 236 | cJSON_AddStringToObject(root ,"do" ,"退群"); 237 | cJSON_AddNumberToObject(root ,"uid" ,gl_uid); 238 | printf("确认要退出群聊 %s ?[yes/no]" ,curGroup -> name); 239 | } 240 | char *out = JSON_prt(root); 241 | JSON_shanchu(root); 242 | sgets(choice ,5); 243 | if(strcmp(choice ,"yes") != 0) 244 | { 245 | free(out); 246 | return; 247 | } 248 | if(send(sockfd ,out ,MSG_LEN ,0) <= 0) 249 | { 250 | perror("send"); 251 | } 252 | free(out); 253 | List_FreeNode(group_list ,curGroup ,group_t); 254 | printf("操作成功!"); 255 | getchar(); 256 | } 257 | void Group_Srv_Del(const char *massage) 258 | { 259 | cJSON *root = JSON_Par(massage); 260 | cJSON *item = JSON_Get_Obj_Item(root ,"gid"); 261 | int gid = item -> valueint; 262 | JSON_shanchu(root); 263 | group_t *g; 264 | List_For_Each(group_list ,g) 265 | { 266 | if(g -> gid == gid) 267 | { 268 | printf("\n群主已将群聊 %s 解散!\n",g -> name); 269 | List_FreeNode(group_list ,g ,group_t); 270 | curGroup = NULL; 271 | return; 272 | } 273 | } 274 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/service/GROUP_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _GROUP_SRV_H 2 | #define _GROUP_SRV_H 3 | typedef struct group_t 4 | { 5 | int gid; 6 | char name[30]; 7 | int owner; 8 | int num; 9 | int NewMsgNum; 10 | struct group_t *next; 11 | } group_t; 12 | int Gro_Srv_Cre(const char *gname); 13 | int Gro_Srv_Add_Mem(int gid ,int uid); 14 | int Gro_Srv_Get_List(); 15 | void Group_Srv_Join(const char *massage); 16 | void Gro_Srv_Show_Mem(const char *massage); 17 | void Group_Srv_Get_Member(int gid); 18 | void Gro_Srv_Quit(group_t *curGroup); 19 | void Group_Srv_Del(const char *massage); 20 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/Common.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include"./Common.h" 5 | int mutex_srv = 0; 6 | void cc_Unlock() 7 | { 8 | mutex_srv = 0; 9 | } 10 | void cc_Lock() 11 | { 12 | while(mutex_srv == 0); 13 | } 14 | void cc_Clear() 15 | { 16 | char ch; 17 | while((ch=getchar())!='\n' && ch!=EOF){} 18 | } 19 | char *sgets(char *str,int len) 20 | { 21 | fgets(str,len,stdin); 22 | if(str[strlen(str)-1]=='\n') 23 | { 24 | str[strlen(str)-1]='\0'; 25 | } 26 | return str; 27 | } 28 | int DateCmp(user_date_t dt1, user_date_t dt2) 29 | { 30 | if (dt1.year < dt2.year) 31 | { 32 | return -1; 33 | } 34 | else if (dt1.month < dt2.month && dt1.year == dt2.year) 35 | { 36 | return -1; 37 | } 38 | else if (dt1.month == dt2.month && dt1.day < dt2.day && dt1.year == dt2.year) 39 | { 40 | return -1; 41 | } 42 | else if (dt1.day == dt2.day && dt1.year == dt2.year && dt1.month == dt2.month) 43 | { 44 | return 0; 45 | } 46 | else 47 | { 48 | return 1; 49 | } 50 | } 51 | user_date_t DateNow() 52 | { 53 | user_date_t curDate; 54 | time_t now; 55 | struct tm *timeNow; 56 | time(&now); 57 | timeNow = localtime(&now); 58 | curDate.year=timeNow->tm_year+1900; 59 | curDate.month=timeNow->tm_mon+1; 60 | curDate.day=timeNow->tm_mday; 61 | return curDate; 62 | } 63 | user_time_t TimeNow() 64 | { 65 | user_time_t curTime; 66 | time_t now; 67 | struct tm *timeNow; 68 | time(&now); 69 | timeNow = localtime(&now); 70 | curTime.hour=timeNow->tm_hour; 71 | curTime.minute=timeNow->tm_min; 72 | curTime.second=timeNow->tm_sec; 73 | return curTime; 74 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/Common.h: -------------------------------------------------------------------------------- 1 | #ifndef _COMMON_H 2 | #define _COMMON_H 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | typedef struct 9 | { 10 | int year; 11 | int month; 12 | int day; 13 | }user_date_t; 14 | typedef struct 15 | { 16 | int hour; 17 | int minute; 18 | int second; 19 | }user_time_t; 20 | void cc_Lock(); 21 | void cc_Unlock(); 22 | char *sgets(char *str,int len); 23 | void cc_Clear(); 24 | int DateCmp(user_date_t dt1, user_date_t dt2); 25 | user_date_t DateNow(); 26 | user_time_t TimeNow(); 27 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/JSON.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "JSON.h" 9 | static const char *ep; 10 | const char *JSON_cuowuzhizhen(void) {return ep;} 11 | static int JSON_bijiao_str(const char *p1,const char *p2) 12 | { 13 | if (!p1) 14 | { 15 | return (p1==p2)?0:1; 16 | } 17 | if (!p2) 18 | { 19 | return 1; 20 | } 21 | for(; tolower(*p1) == tolower(*p2); ++p1, ++p2) 22 | { 23 | if(*p1 == 0) 24 | { 25 | return 0; 26 | } 27 | } 28 | return tolower(*(const unsigned char *)p1) - tolower(*(const unsigned char *)p2); 29 | } 30 | static void (*cJSON_free)(void *ptr) = free; 31 | static void *(*cJSON_malloc)(size_t sz) = malloc; 32 | void JSON_csh_gouzi(JSON_gouzi * hooks)//// 33 | { 34 | if (!hooks) 35 | { 36 | cJSON_free = free; 37 | cJSON_malloc = malloc; 38 | return; 39 | } 40 | cJSON_free = (hooks->free_fn)?hooks->free_fn:free; 41 | cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; 42 | } 43 | static char* JSON_chuanlian(const char* str)//// 44 | { 45 | char* copy; 46 | size_t len; 47 | len = strlen(str) + 1; 48 | if (!(copy = (char*)cJSON_malloc(len))) 49 | { 50 | return 0; 51 | } 52 | memcpy(copy,str,len); 53 | return copy; 54 | } 55 | static cJSON *JSON_xwp(void) 56 | { 57 | cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); 58 | if (node) 59 | { 60 | memset(node,0,sizeof(cJSON)); 61 | } 62 | return node; 63 | } 64 | void JSON_shanchu(cJSON *c) 65 | { 66 | cJSON *next; 67 | while(c) 68 | { 69 | next=c->next; 70 | if (c->child&&!(c->type&cJSON_IsReference)) 71 | { 72 | JSON_shanchu(c->child); 73 | } 74 | if (c->valuestring&&!(c->type&cJSON_IsReference)) 75 | { 76 | cJSON_free(c->valuestring); 77 | } 78 | if (c->string&&!(c->type&cJSON_StringIsConst)) 79 | { 80 | cJSON_free(c->string); 81 | } 82 | cJSON_free(c); 83 | c=next; 84 | } 85 | } 86 | static const char *par_num(cJSON *item,const char *num) 87 | { 88 | int sub=0,signsub=1; 89 | double n=0,sca=0,sig=1; 90 | if (*num=='-') 91 | { 92 | sig=-1,num++; 93 | } 94 | if (*num=='0') 95 | { 96 | num++; 97 | } 98 | if (*num<='9'&&*num>='1') 99 | { 100 | do n=(n*10.0)+(*num++ -'0'); 101 | while (*num<='9'&&*num>='0'); 102 | } 103 | if (*num=='.' && num[1]>='0' && num[1]<='9') 104 | { 105 | num++; 106 | do n=(n*10.0)+(*num++ -'0'),sca--; 107 | while (*num<='9'&&*num>='0'); 108 | } 109 | if (*num=='E'||*num=='e') 110 | { 111 | num++; 112 | if (*num=='+') 113 | { 114 | num++; 115 | } 116 | else if (*num=='-') 117 | { 118 | signsub=-1,num++; 119 | } 120 | while (*num<='9'&&*num>='0') sub=(sub*10)+(*num++ - '0'); 121 | } 122 | n=sig*n*pow(10.0,(sca+sub*signsub)); 123 | item->valuedouble=n; 124 | item->valueint=(int)n; 125 | item->type=JSON_NUM; 126 | return num; 127 | } 128 | static int po2 (int x) 129 | { 130 | --x; 131 | x|=x>>1; 132 | x|=x>>2; 133 | x|=x>>4; 134 | x|=x>>8; 135 | x|=x>>16; 136 | return x+1; 137 | } 138 | typedef struct {char *buffer; int length; int offset; } printbuffer; 139 | static char* queren(printbuffer *p,int nedd) 140 | { 141 | int new_siz; 142 | char *new_buf; 143 | if (!p || !p->buffer) 144 | { 145 | return 0; 146 | } 147 | nedd+=p->offset; 148 | if (nedd<=p->length) 149 | { 150 | return p->buffer+p->offset; 151 | } 152 | new_siz=po2(nedd); 153 | new_buf=(char*)cJSON_malloc(new_siz); 154 | if (!new_buf) 155 | { 156 | cJSON_free(p->buffer); 157 | p->length=0,p->buffer=0; 158 | return 0; 159 | } 160 | if (new_buf) 161 | { 162 | memcpy(new_buf,p->buffer,p->length); 163 | } 164 | cJSON_free(p->buffer); 165 | p->buffer=new_buf; 166 | p->length=new_siz; 167 | return new_buf+p->offset; 168 | } 169 | static int gengxin(printbuffer *p) 170 | { 171 | char *str; 172 | if (!p || !p->buffer) 173 | { 174 | return 0; 175 | } 176 | str=p->buffer+p->offset; 177 | return p->offset+strlen(str); 178 | } 179 | static char *print_number(cJSON *item,printbuffer *p) 180 | { 181 | double d=item->valuedouble; 182 | char *str=0; 183 | if (d==0) 184 | { 185 | if (p) 186 | { 187 | str=queren(p,2); 188 | } 189 | else 190 | { 191 | str=(char*)cJSON_malloc(2); 192 | } 193 | if (str) 194 | { 195 | strcpy(str,"0"); 196 | } 197 | } 198 | else if (d<=INT_MAX && d>=INT_MIN && fabs(((double)item->valueint)-d)<=DBL_EPSILON) 199 | { 200 | if (p) 201 | { 202 | str=queren(p,21); 203 | } 204 | else 205 | { 206 | str=(char*)cJSON_malloc(21); 207 | } 208 | if (str) 209 | { 210 | sprintf(str,"%d",item->valueint); 211 | } 212 | } 213 | else 214 | { 215 | if (p) 216 | { 217 | str=queren(p,64); 218 | } 219 | else 220 | { 221 | str=(char*)cJSON_malloc(64); 222 | } 223 | if (str) 224 | { 225 | if (fabs(d)<1.0e60&&fabs(floor(d)-d)<=DBL_EPSILON) 226 | { 227 | sprintf(str,"%.0f",d); 228 | } 229 | else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) 230 | { 231 | sprintf(str,"%e",d); 232 | } 233 | else 234 | { 235 | sprintf(str,"%f",d); 236 | } 237 | } 238 | } 239 | return str; 240 | } 241 | static unsigned par_h4(const char *str) 242 | { 243 | unsigned h=0; 244 | if (*str<='9'&&*str>='0') 245 | { 246 | h+=(*str)-'0'; 247 | } 248 | else if (*str<='F'&&*str>='A') 249 | { 250 | h+=10+(*str)-'A'; 251 | } 252 | else if (*str<='f'&&*str>='a') 253 | { 254 | h+=10+(*str)-'a'; 255 | } 256 | else 257 | { 258 | return 0; 259 | } 260 | h=h<<4; 261 | str+=1; 262 | if (*str<='9'&&*str>='0') 263 | { 264 | h+=(*str)-'0'; 265 | } 266 | else if (*str<='F'&&*str>='A') 267 | { 268 | h+=10+(*str)-'A'; 269 | } 270 | else if (*str<='f'&&*str>='a') 271 | { 272 | h+=10+(*str)-'a'; 273 | } 274 | else 275 | { 276 | return 0; 277 | } 278 | h=h<<4; 279 | str+=1; 280 | if (*str<='9'&&*str>='0') 281 | { 282 | h+=(*str)-'0'; 283 | } 284 | else if (*str<='F'&&*str>='A') 285 | { 286 | h+=10+(*str)-'A'; 287 | } 288 | else if (*str<='f'&&*str>='a') 289 | { 290 | h+=10+(*str)-'a'; 291 | } 292 | else 293 | { 294 | return 0; 295 | } 296 | h=h<<4; 297 | str+=1; 298 | if (*str<='9'&&*str>='0') 299 | { 300 | h+=(*str)-'0'; 301 | } 302 | else if (*str<='F'&&*str>='A') 303 | { 304 | h+=10+(*str)-'A'; 305 | } 306 | else if (*str<='f'&&*str>='a') 307 | { 308 | h+=10+(*str)-'a'; 309 | } 310 | else 311 | { 312 | return 0; 313 | } 314 | return h; 315 | } 316 | static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; 317 | static const char *par_str(cJSON *item,const char *str) 318 | { 319 | int len=0; 320 | char *out; 321 | const char *ptr=str+1; 322 | char *ptr2; 323 | unsigned ac_a,ac_b; 324 | if (*str!='\"') 325 | { 326 | ep=str; 327 | return 0; 328 | } 329 | while (*ptr && ++len && *ptr!='\"') 330 | { 331 | if (*ptr++ == '\\') 332 | { 333 | ptr+=1; 334 | } 335 | } 336 | out=(char*)cJSON_malloc(len+1); 337 | if (!out) 338 | { 339 | return 0; 340 | } 341 | ptr=str+1; 342 | ptr2=out; 343 | while (*ptr && *ptr!='\"') 344 | { 345 | if (*ptr!='\\') 346 | { 347 | *ptr2++=*ptr++; 348 | } 349 | else 350 | { 351 | ptr+=1; 352 | switch (*ptr) 353 | { 354 | case 'b': *ptr2++='\b'; break; 355 | case 'f': *ptr2++='\f'; break; 356 | case 'n': *ptr2++='\n'; break; 357 | case 'r': *ptr2++='\r'; break; 358 | case 't': *ptr2++='\t'; break; 359 | case 'u': 360 | ac_a=par_h4(ptr+1); 361 | ptr+=4; 362 | if ((ac_a>=0xDC00 && ac_a<=0xDFFF) || ac_a==0) 363 | { 364 | break; 365 | } 366 | if (ac_a>=0xD800 && ac_a<=0xDBFF) 367 | { 368 | if (ptr[1]!='\\' || ptr[2]!='u') 369 | { 370 | break; 371 | } 372 | ac_b=par_h4(ptr+3); 373 | ptr+=6; 374 | if (ac_b<0xDC00 || ac_b>0xDFFF) 375 | { 376 | break; 377 | } 378 | ac_a=0x10000 + (((ac_a&0x3FF)<<10) | (ac_b&0x3FF)); 379 | } 380 | len=4; 381 | if (ac_a<0x80) 382 | { 383 | len=1; 384 | } 385 | else if (ac_a<0x800) 386 | { 387 | len=2; 388 | } 389 | else if (ac_a<0x10000) 390 | { 391 | len=3; 392 | } 393 | ptr2+=len; 394 | switch (len) 395 | { 396 | case 1: *--ptr2 =(ac_a | firstByteMark[len]); 397 | case 2: *--ptr2 =((ac_a | 0x80) & 0xBF); ac_a >>= 6; 398 | case 3: *--ptr2 =((ac_a | 0x80) & 0xBF); ac_a >>= 6; 399 | case 4: *--ptr2 =((ac_a | 0x80) & 0xBF); ac_a >>= 6; 400 | } 401 | ptr2+=len; 402 | break; 403 | default: *ptr2++=*ptr; 404 | break; 405 | } 406 | ptr+=1; 407 | } 408 | } 409 | *ptr2=0; 410 | if (*ptr=='\"') 411 | { 412 | ptr+=1; 413 | } 414 | item->type=JSON_STRING; 415 | item->valuestring=out; 416 | return ptr; 417 | } 418 | static char *prt_str_ptr(const char *str,printbuffer *p) 419 | { 420 | int len=0,flag=0; 421 | const char *ptr; 422 | char *ptr2,*out; 423 | unsigned char tok; 424 | for (ptr=str;*ptr;ptr++) 425 | { 426 | flag|=((*ptr>0 && *ptr<32)||(*ptr=='\"')||(*ptr=='\\'))?1:0; 427 | } 428 | if (!flag) 429 | { 430 | len=ptr-str; 431 | if (p) 432 | { 433 | out=queren(p,len+3); 434 | } 435 | else 436 | { 437 | out=(char*)cJSON_malloc(len+3); 438 | } 439 | if (!out) 440 | { 441 | return 0; 442 | } 443 | ptr2=out; 444 | *ptr2++='\"'; 445 | strcpy(ptr2,str); 446 | ptr2[len]='\"'; 447 | ptr2[len+1]=0; 448 | return out; 449 | } 450 | if (!str) 451 | { 452 | if (p) 453 | { 454 | out=queren(p,3); 455 | } 456 | else 457 | { 458 | out=(char*)cJSON_malloc(3); 459 | } 460 | if (!out) 461 | { 462 | return 0; 463 | } 464 | strcpy(out,"\"\""); 465 | return out; 466 | } 467 | ptr=str; 468 | while ((tok=*ptr) && ++len) 469 | { 470 | if (strchr("\"\\\b\f\n\r\t",tok)) 471 | { 472 | len+=1; 473 | } 474 | else if (tok<=31) 475 | { 476 | len+=5; 477 | } 478 | ptr+=1; 479 | } 480 | if (p) 481 | { 482 | out=queren(p,len+3); 483 | } 484 | else 485 | { 486 | out=(char*)cJSON_malloc(len+3); 487 | } 488 | if (!out) 489 | { 490 | return 0; 491 | } 492 | ptr=str; 493 | ptr2=out; 494 | *ptr2++='\"'; 495 | while (*ptr) 496 | { 497 | if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') 498 | { 499 | *ptr2++=*ptr++; 500 | } 501 | else 502 | { 503 | *ptr2++='\\'; 504 | switch (tok=*ptr++) 505 | { 506 | case '\\': *ptr2++='\\'; break; 507 | case '\"': *ptr2++='\"'; break; 508 | case '\b': *ptr2++='b'; break; 509 | case '\f': *ptr2++='f'; break; 510 | case '\n': *ptr2++='n'; break; 511 | case '\r': *ptr2++='r'; break; 512 | case '\t': *ptr2++='t'; break; 513 | default: sprintf(ptr2,"u%04x",tok);ptr2+=5; 514 | break; 515 | } 516 | } 517 | } 518 | *ptr2++='\"'; 519 | *ptr2++=0; 520 | return out; 521 | } 522 | static char *prt_str(cJSON *item,printbuffer *p) 523 | { 524 | return prt_str_ptr(item->valuestring,p); 525 | } 526 | static const char *par_obj(cJSON *item,const char *value); 527 | static const char *par_val(cJSON *item,const char *value); 528 | static const char *par_arr(cJSON *item,const char *value); 529 | static char *prt_obj(cJSON *item,int dep,int fmt,printbuffer *p); 530 | static char *prt_val(cJSON *item,int dep,int fmt,printbuffer *p); 531 | static char *prt_arr(cJSON *item,int dep,int fmt,printbuffer *p); 532 | static const char *skip(const char *in) 533 | { 534 | while (*in && (unsigned char)*in<=32 && in) 535 | { 536 | in+=1; 537 | } 538 | return in; 539 | } 540 | cJSON *JSON_Par_wit(const char *value,const char **return_parse_end,int req_null_ter) 541 | { 542 | cJSON *c=JSON_xwp(); 543 | const char *end=0; 544 | ep=0; 545 | if (!c) 546 | { 547 | return 0; 548 | } 549 | end=par_val(c,skip(value)); 550 | if (!end) 551 | { 552 | JSON_shanchu(c); 553 | return 0; 554 | } 555 | if (req_null_ter) 556 | { 557 | end=skip(end); 558 | if (*end) 559 | { 560 | JSON_shanchu(c); 561 | ep=end; 562 | return 0; 563 | } 564 | } 565 | if (return_parse_end) 566 | { 567 | *return_parse_end=end; 568 | } 569 | return c; 570 | } 571 | cJSON *JSON_Par(const char *value) 572 | { 573 | return JSON_Par_wit(value,0,0); 574 | } 575 | char *JSON_prt(cJSON *item) 576 | { 577 | return prt_val(item,0,1,0); 578 | } 579 | char *JSON_puf(cJSON *item) 580 | { 581 | return prt_val(item,0,0,0); 582 | } 583 | 584 | char *JSON_pbuf(cJSON *item,int prebuffer,int fmt) 585 | { 586 | printbuffer p; 587 | p.buffer=(char*)cJSON_malloc(prebuffer); 588 | p.length=prebuffer; 589 | p.offset=0; 590 | return prt_val(item,0,fmt,&p); 591 | return p.buffer; 592 | } 593 | static const char *par_val(cJSON *item,const char *value) 594 | { 595 | if (!value) 596 | { 597 | return 0; 598 | } 599 | if (!strncmp(value,"null",4)) 600 | { 601 | item->type=JSON_NULL; 602 | return value+4; 603 | } 604 | if (!strncmp(value,"false",5)) 605 | { 606 | item->type=JSON_FALSE; 607 | return value+5; 608 | } 609 | if (!strncmp(value,"true",4)) 610 | { 611 | item->type=JSON_TRUE; 612 | item->valueint=1; 613 | return value+4; 614 | } 615 | if (*value=='\"') 616 | { 617 | return par_str(item,value); 618 | } 619 | if (*value=='-' || (*value<='9' && *value>='0')) 620 | { 621 | return par_num(item,value); 622 | } 623 | if (*value=='[') 624 | { 625 | return par_arr(item,value); 626 | } 627 | if (*value=='{') 628 | { 629 | return par_obj(item,value); 630 | } 631 | ep=value; 632 | return 0; 633 | } 634 | static char *prt_val(cJSON *item,int dep,int fmt,printbuffer *p) 635 | { 636 | char *out=0; 637 | if (!item) 638 | { 639 | return 0; 640 | } 641 | if (p) 642 | { 643 | switch ((item->type)&255) 644 | { 645 | case JSON_NULL: { 646 | out=queren(p,5); 647 | if (out) 648 | { 649 | strcpy(out,"null"); 650 | } 651 | break; 652 | } 653 | case JSON_FALSE:{ 654 | out=queren(p,6); 655 | if (out) 656 | { 657 | strcpy(out,"false"); 658 | } 659 | break; 660 | } 661 | case JSON_TRUE: { 662 | out=queren(p,5); 663 | if (out) 664 | { 665 | strcpy(out,"true"); 666 | } 667 | break; 668 | } 669 | case JSON_NUM: 670 | out=print_number(item,p); 671 | break; 672 | case JSON_STRING: 673 | out=prt_str(item,p); 674 | break; 675 | case JSON_ARRAY: 676 | out=prt_arr(item,dep,fmt,p); 677 | break; 678 | case JSON_OBJECT: 679 | out=prt_obj(item,dep,fmt,p); 680 | break; 681 | } 682 | } 683 | else 684 | { 685 | switch ((item->type)&255) 686 | { 687 | case JSON_NULL: 688 | out=JSON_chuanlian("null"); 689 | break; 690 | case JSON_FALSE: 691 | out=JSON_chuanlian("false"); 692 | break; 693 | case JSON_TRUE: 694 | out=JSON_chuanlian("true"); 695 | break; 696 | case JSON_NUM: 697 | out=print_number(item,0); 698 | break; 699 | case JSON_STRING: 700 | out=prt_str(item,0); 701 | break; 702 | case JSON_ARRAY: 703 | out=prt_arr(item,dep,fmt,0); 704 | break; 705 | case JSON_OBJECT: 706 | out=prt_obj(item,dep,fmt,0); 707 | break; 708 | } 709 | } 710 | return out; 711 | } 712 | static const char *par_arr(cJSON *item,const char *value) 713 | { 714 | cJSON *child; 715 | if (*value!='[') 716 | { 717 | ep=value; 718 | return 0; 719 | } 720 | value=skip(value+1); 721 | item->type=JSON_ARRAY; 722 | if (*value==']') 723 | { 724 | return value+1; 725 | } 726 | item->child=child=JSON_xwp(); 727 | if (!item->child) 728 | { 729 | return 0; 730 | } 731 | value=skip(par_val(child,skip(value))); 732 | if (!value) 733 | { 734 | return 0; 735 | } 736 | while (*value==',') 737 | { 738 | cJSON *new_item; 739 | if (!(new_item=JSON_xwp())) 740 | { 741 | return 0; 742 | } 743 | child->next=new_item; 744 | new_item->prev=child; 745 | child=new_item; 746 | value=skip(par_val(child,skip(value+1))); 747 | if (!value) 748 | { 749 | return 0; 750 | } 751 | } 752 | if (*value==']') 753 | { 754 | return value+1; 755 | } 756 | ep=value;return 0; 757 | } 758 | static char *prt_arr(cJSON *item,int dep,int fmt,printbuffer *p) 759 | { 760 | char *out=0,*ptr,*ret; 761 | char **entri; 762 | cJSON *child=item->child; 763 | int len=5,nert=0,i=0,fail=0; 764 | size_t tmplen=0; 765 | while (child) 766 | { 767 | nert++,child=child->next; 768 | } 769 | if (!nert) 770 | { 771 | if (p) 772 | { 773 | out=queren(p,3); 774 | } 775 | else 776 | { 777 | out=(char*)cJSON_malloc(3); 778 | } 779 | if (out) 780 | { 781 | strcpy(out,"[]"); 782 | } 783 | return out; 784 | } 785 | if (p) 786 | { 787 | i=p->offset; 788 | ptr=queren(p,1); 789 | if (!ptr) 790 | { 791 | return 0; 792 | } 793 | *ptr='['; 794 | p->offset++; 795 | child=item->child; 796 | while (child && !fail) 797 | { 798 | prt_val(child,dep+1,fmt,p); 799 | p->offset=gengxin(p); 800 | if (child->next) 801 | { 802 | len=fmt?2:1; 803 | ptr=queren(p,len+1); 804 | if (!ptr) 805 | { 806 | return 0; 807 | } 808 | *ptr++=','; 809 | if(fmt) 810 | { 811 | *ptr++=' '; 812 | } 813 | *ptr=0; 814 | p->offset+=len; 815 | } 816 | child=child->next; 817 | } 818 | ptr=queren(p,2); 819 | if (!ptr) 820 | { 821 | return 0; 822 | } 823 | *ptr++=']'; 824 | *ptr=0; 825 | out=(p->buffer)+i; 826 | } 827 | else 828 | { 829 | entri=(char**)cJSON_malloc(nert*sizeof(char*)); 830 | if (!entri) 831 | { 832 | return 0; 833 | } 834 | memset(entri,0,nert*sizeof(char*)); 835 | child=item->child; 836 | while (child && !fail) 837 | { 838 | ret=prt_val(child,dep+1,fmt,0); 839 | entri[i++]=ret; 840 | if (ret) 841 | { 842 | len+=strlen(ret)+2+(fmt?1:0); 843 | } 844 | else 845 | { 846 | fail=1; 847 | } 848 | child=child->next; 849 | } 850 | if (!fail) 851 | { 852 | out=(char*)cJSON_malloc(len); 853 | } 854 | if (!out) 855 | { 856 | fail=1; 857 | } 858 | if (fail) 859 | { 860 | for (i=0;itype=JSON_OBJECT; 904 | value=skip(value+1); 905 | if (*value=='}') 906 | { 907 | return value+1; 908 | } 909 | item->child=child=JSON_xwp(); 910 | if (!item->child) 911 | { 912 | return 0; 913 | } 914 | value=skip(par_str(child,skip(value))); 915 | if (!value) 916 | { 917 | return 0; 918 | } 919 | child->string=child->valuestring; 920 | child->valuestring=0; 921 | if (*value!=':') 922 | { 923 | ep=value; 924 | return 0; 925 | } 926 | value=skip(par_val(child,skip(value+1))); 927 | if (!value) 928 | { 929 | return 0; 930 | } 931 | while (*value==',') 932 | { 933 | cJSON *new_item; 934 | if (!(new_item=JSON_xwp())) 935 | { 936 | return 0; 937 | } 938 | child->next=new_item; 939 | new_item->prev=child; 940 | child=new_item; 941 | value=skip(par_str(child,skip(value+1))); 942 | if (!value) 943 | { 944 | return 0; 945 | } 946 | child->string=child->valuestring; 947 | child->valuestring=0; 948 | if (*value!=':') 949 | { 950 | ep=value; 951 | return 0; 952 | } 953 | value=skip(par_val(child,skip(value+1))); 954 | if (!value) 955 | { 956 | return 0; 957 | } 958 | } 959 | if (*value=='}') 960 | { 961 | return value+1; 962 | } 963 | ep=value; 964 | return 0; 965 | } 966 | static char *prt_obj(cJSON *item,int dep,int fmt,printbuffer *p) 967 | { 968 | char **entri=0,**names=0,*out=0,*ptr,*ret,*str; 969 | int len=7,i=0,j,nert=0,fail=0; 970 | cJSON *child=item->child; 971 | size_t tmplen=0; 972 | while (child) 973 | { 974 | nert++,child=child->next; 975 | } 976 | if (!nert) 977 | { 978 | if (p) 979 | { 980 | out=queren(p,fmt?dep+4:3); 981 | } 982 | else 983 | { 984 | out=(char*)cJSON_malloc(fmt?dep+4:3); 985 | } 986 | if (!out) 987 | { 988 | return 0; 989 | } 990 | ptr=out; 991 | *ptr++='{'; 992 | if (fmt) 993 | { 994 | *ptr++='\n'; 995 | for (i=0;ioffset; 1007 | len=fmt?2:1; 1008 | ptr=queren(p,len+1); 1009 | if (!ptr) 1010 | { 1011 | return 0; 1012 | } 1013 | *ptr++='{'; 1014 | if (fmt) 1015 | { 1016 | *ptr++='\n'; 1017 | } 1018 | *ptr=0; 1019 | p->offset+=len; 1020 | child=item->child; 1021 | dep+=1; 1022 | while (child) 1023 | { 1024 | if (fmt) 1025 | { 1026 | ptr=queren(p,dep); 1027 | if (!ptr) 1028 | { 1029 | return 0; 1030 | } 1031 | for (j=0;joffset+=dep; 1036 | } 1037 | prt_str_ptr(child->string,p); 1038 | p->offset=gengxin(p); 1039 | len=fmt?2:1; 1040 | ptr=queren(p,len); 1041 | if (!ptr) 1042 | { 1043 | return 0; 1044 | } 1045 | *ptr++=':'; 1046 | if (fmt) 1047 | { 1048 | *ptr++='\t'; 1049 | } 1050 | p->offset+=len; 1051 | prt_val(child,dep,fmt,p); 1052 | p->offset=gengxin(p); 1053 | len=(fmt?1:0)+(child->next?1:0); 1054 | ptr=queren(p,len+1); 1055 | if (!ptr) ////////////////////////////////////// 1056 | { 1057 | return 0; 1058 | } 1059 | if (child->next) 1060 | { 1061 | *ptr++=','; 1062 | } 1063 | 1064 | if (fmt) 1065 | { 1066 | *ptr++='\n'; 1067 | } 1068 | *ptr=0; 1069 | p->offset+=len; 1070 | child=child->next; 1071 | } 1072 | ptr=queren(p,fmt?(dep+1):2); 1073 | if (!ptr) //////////////////////////////////////////// 1074 | { 1075 | return 0; 1076 | } 1077 | if (fmt) 1078 | { 1079 | for (i=0;ibuffer)+i; 1087 | } 1088 | else 1089 | { 1090 | entri=(char**)cJSON_malloc(nert*sizeof(char*)); 1091 | if (!entri) 1092 | { 1093 | return 0; 1094 | } 1095 | names=(char**)cJSON_malloc(nert*sizeof(char*)); 1096 | if (!names) 1097 | { 1098 | cJSON_free(entri); 1099 | return 0; 1100 | } 1101 | memset(entri,0,sizeof(char*)*nert); 1102 | memset(names,0,sizeof(char*)*nert); 1103 | child=item->child; 1104 | dep++; 1105 | if (fmt) 1106 | { 1107 | len+=dep; 1108 | } 1109 | while (child) 1110 | { 1111 | names[i]=str=prt_str_ptr(child->string,0); 1112 | entri[i++]=ret=prt_val(child,dep,fmt,0); 1113 | if (str && ret) 1114 | { 1115 | len+=strlen(ret)+strlen(str)+2+(fmt?2+dep:0); 1116 | } 1117 | else 1118 | { 1119 | fail=1; 1120 | } 1121 | child=child->next; 1122 | } 1123 | if (!fail) 1124 | { 1125 | out=(char*)cJSON_malloc(len); 1126 | } 1127 | if (!out) 1128 | { 1129 | fail=1; 1130 | } 1131 | if (fail) 1132 | {///////////////////////////////////////////// 1133 | for (i=0;ichild; 1203 | int i=0; 1204 | while(c)i++,c=c->next; 1205 | return i; 1206 | } 1207 | cJSON *JSON_Get_Arr_Item(cJSON *array,int item) 1208 | { 1209 | cJSON *c=array->child; 1210 | while (c && item>0) item--,c=c->next; 1211 | return c; 1212 | } 1213 | cJSON *JSON_Get_Obj_Item(cJSON *object,const char *string) 1214 | { 1215 | cJSON *c=object->child; 1216 | while (c && JSON_bijiao_str(c->string,string)) c=c->next; 1217 | return c; 1218 | } 1219 | static void suffix_object(cJSON *prev,cJSON *item) 1220 | { 1221 | prev->next=item; 1222 | item->prev=prev; 1223 | } 1224 | static cJSON *create_reference(cJSON *item) 1225 | { 1226 | cJSON *ref=JSON_xwp(); 1227 | if (!ref) 1228 | { 1229 | return 0; 1230 | } 1231 | memcpy(ref,item,sizeof(cJSON)); 1232 | ref->string=0; 1233 | ref->type|=cJSON_IsReference; 1234 | ref->next=ref->prev=0; 1235 | return ref; 1236 | } 1237 | void JSON_Add_Item_To_Arr(cJSON *array, cJSON *item) 1238 | { 1239 | cJSON *c=array->child; 1240 | if (!item) 1241 | { 1242 | return; 1243 | } 1244 | if (!c) 1245 | { 1246 | array->child=item; 1247 | } 1248 | else 1249 | { 1250 | while (c && c->next) c=c->next; 1251 | suffix_object(c,item); 1252 | } 1253 | } 1254 | void JSON_Add_Item_To_Obj(cJSON *object,const char *string,cJSON *item) 1255 | { 1256 | if (!item) return; 1257 | if (item->string) cJSON_free(item->string); 1258 | item->string=JSON_chuanlian(string); 1259 | JSON_Add_Item_To_Arr(object,item); 1260 | } 1261 | void JSON_Add_Item_To_Obj_CS(cJSON *object,const char *string,cJSON *item) 1262 | { 1263 | if (!item) return; 1264 | if (!(item->type&cJSON_StringIsConst) && item->string) 1265 | cJSON_free(item->string); 1266 | item->string=(char*)string;item->type|=cJSON_StringIsConst; 1267 | JSON_Add_Item_To_Arr(object,item); 1268 | } 1269 | void JSON_Add_Item_Ref_To_Arr(cJSON *array, cJSON *item) 1270 | { 1271 | JSON_Add_Item_To_Arr(array,create_reference(item)); 1272 | } 1273 | void JSON_Add_Item_Ref_To_Obj(cJSON *object,const char *string,cJSON *item) 1274 | { 1275 | JSON_Add_Item_To_Obj(object,string,create_reference(item)); 1276 | } 1277 | 1278 | cJSON *JSON_Det_Item_From_Arr(cJSON *array,int which) 1279 | { 1280 | cJSON *c=array->child; 1281 | while (c && which>0) c=c->next,which--; 1282 | if (!c) return 0; 1283 | if (c->prev) //////////////////////////// 1284 | c->prev->next=c->next; 1285 | if (c->next) 1286 | c->next->prev=c->prev; 1287 | if (c==array->child) 1288 | array->child=c->next; 1289 | c->prev=c->next=0; 1290 | return c; 1291 | } 1292 | void JSON_Del_Item_From_Arr(cJSON *array,int which) 1293 | { 1294 | JSON_shanchu(JSON_Det_Item_From_Arr(array,which)); 1295 | } 1296 | cJSON *JSON_Det_Item_From_Obj(cJSON *object,const char *string) 1297 | { 1298 | int i=0; 1299 | cJSON *c=object->child; 1300 | while (c && JSON_bijiao_str(c->string,string)) i++,c=c->next; 1301 | if (c) return JSON_Det_Item_From_Arr(object,i);return 0; 1302 | } 1303 | void JSON_Del_Item_From_Obj(cJSON *object,const char *string) 1304 | { 1305 | JSON_shanchu(JSON_Det_Item_From_Obj(object,string)); 1306 | } 1307 | void JSON_Ins_Item_In_Arr(cJSON *array,int which,cJSON *newitem) 1308 | { 1309 | cJSON *c=array->child; 1310 | while (c && which>0) c=c->next,which--; 1311 | if (!c) 1312 | { 1313 | JSON_Add_Item_To_Arr(array,newitem); 1314 | return; 1315 | } 1316 | newitem->next=c; 1317 | newitem->prev=c->prev;c->prev=newitem; 1318 | if (c==array->child) array->child=newitem; 1319 | else newitem->prev->next=newitem; 1320 | } 1321 | void JSON_Rep_Item_In_Arr(cJSON *array,int which,cJSON *newitem) 1322 | { 1323 | cJSON *c=array->child; 1324 | while (c && which>0) c=c->next,which--; 1325 | if (!c) return; 1326 | newitem->next=c->next;newitem->prev=c->prev; 1327 | if (newitem->next) newitem->next->prev=newitem; 1328 | if (c==array->child) array->child=newitem; 1329 | else newitem->prev->next=newitem; 1330 | c->next=c->prev=0; 1331 | JSON_shanchu(c); 1332 | } 1333 | void JSON_Rep_Item_In_Obj(cJSON *object,const char *string,cJSON *newitem) 1334 | { 1335 | int i=0; 1336 | cJSON *c=object->child; 1337 | while(c && JSON_bijiao_str(c->string,string))i++,c=c->next; 1338 | if(c) 1339 | { 1340 | newitem->string=JSON_chuanlian(string); 1341 | JSON_Rep_Item_In_Arr(object,i,newitem); 1342 | } 1343 | } 1344 | cJSON *JSON_Cre_Null(void) 1345 | { 1346 | cJSON *item=JSON_xwp(); 1347 | if(item)item->type=JSON_NULL; 1348 | return item; 1349 | } 1350 | cJSON *JSON_Cre_True(void) 1351 | { 1352 | cJSON *item=JSON_xwp(); 1353 | if(item)item->type=JSON_TRUE; 1354 | return item; 1355 | } 1356 | cJSON *JSON_Cre_False(void) 1357 | { 1358 | cJSON *item=JSON_xwp(); 1359 | if(item)item->type=JSON_FALSE; 1360 | return item; 1361 | } 1362 | cJSON *JSON_Cre_Bool(int b) 1363 | { 1364 | cJSON *item=JSON_xwp(); 1365 | if(item)item->type=b?JSON_TRUE:JSON_FALSE; 1366 | return item; 1367 | } 1368 | cJSON *JSON_Cre_Num(double num) 1369 | { 1370 | cJSON *item=JSON_xwp(); 1371 | if(item) 1372 | { 1373 | item->type=JSON_NUM; 1374 | item->valuedouble=num; 1375 | item->valueint=(int)num; 1376 | } 1377 | return item; 1378 | } 1379 | cJSON *JSON_Cre_Str(const char *string) 1380 | { 1381 | cJSON *item=JSON_xwp(); 1382 | if(item) 1383 | { 1384 | item->type=JSON_STRING; 1385 | item->valuestring=JSON_chuanlian(string); 1386 | } 1387 | return item; 1388 | } 1389 | cJSON *JSON_Cre_Arr(void) 1390 | { 1391 | cJSON *item=JSON_xwp(); 1392 | if(item)item->type=JSON_ARRAY; 1393 | return item; 1394 | } 1395 | cJSON *JSON_Cre_Obj(void) 1396 | { 1397 | cJSON *item=JSON_xwp(); 1398 | if(item)item->type=JSON_OBJECT; 1399 | return item; 1400 | } 1401 | cJSON *JSON_Cre_Int_Arr(const int *numbers,int count) 1402 | { 1403 | int i; 1404 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1405 | for(i=0;a && ichild=n; 1409 | else suffix_object(p,n); 1410 | p=n; 1411 | } 1412 | return a; 1413 | } 1414 | cJSON *JSON_Cre_Float_Arr(const float *numbers,int count) 1415 | { 1416 | int i; 1417 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1418 | for(i=0;a && ichild=n; 1422 | else suffix_object(p,n); 1423 | p=n; 1424 | } 1425 | return a; 1426 | } 1427 | cJSON *JSON_Cre_Double_Arr(const double *numbers,int count) 1428 | { 1429 | int i; 1430 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1431 | for(i=0;a && ichild=n; 1435 | else suffix_object(p,n); 1436 | p=n; 1437 | } 1438 | return a; 1439 | } 1440 | cJSON *JSON_Cre_Str_Arr(const char **strings,int count) 1441 | { 1442 | int i; 1443 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1444 | for(i=0;a && ichild=n; 1448 | else suffix_object(p,n); 1449 | p=n; 1450 | } 1451 | return a; 1452 | } 1453 | cJSON *JSON_Dup(cJSON *item,int recurse) 1454 | { 1455 | cJSON *newitem,*cptr,*nptr=0,*newchild; 1456 | if (!item) return 0; 1457 | newitem=JSON_xwp(); 1458 | if (!newitem) return 0; 1459 | newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble; 1460 | if (item->valuestring) 1461 | { 1462 | newitem->valuestring=JSON_chuanlian(item->valuestring); 1463 | if (!newitem->valuestring) 1464 | { 1465 | JSON_shanchu(newitem); 1466 | return 0; 1467 | } 1468 | } 1469 | if (item->string) 1470 | { 1471 | newitem->string=JSON_chuanlian(item->string); 1472 | if (!newitem->string) 1473 | { 1474 | JSON_shanchu(newitem); 1475 | return 0; 1476 | } 1477 | } 1478 | if (!recurse) return newitem; 1479 | cptr=item->child; 1480 | while (cptr) 1481 | { 1482 | newchild=JSON_Dup(cptr,1); 1483 | if (!newchild) 1484 | { 1485 | JSON_shanchu(newitem); 1486 | return 0; 1487 | } 1488 | if (nptr) 1489 | { 1490 | nptr->next=newchild,newchild->prev=nptr; 1491 | nptr=newchild; 1492 | } 1493 | else 1494 | { 1495 | newitem->child=newchild; 1496 | nptr=newchild; 1497 | } 1498 | cptr=cptr->next; 1499 | } 1500 | return newitem; 1501 | } 1502 | void JSON_Minify(char *json) 1503 | { 1504 | char *into=json; 1505 | while (*json) 1506 | { 1507 | if (*json==' ') json++; 1508 | else if (*json=='\t') json++; 1509 | else if (*json=='\r') json++; 1510 | else if (*json=='\n') json++; 1511 | else if (*json=='/' && json[1]=='/') while (*json && *json!='\n') json++; 1512 | else if (*json=='/' && json[1]=='*') 1513 | { 1514 | while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2; 1515 | } 1516 | else if (*json=='\"') 1517 | { 1518 | *into++=*json++; 1519 | while (*json && *json!='\"') 1520 | { 1521 | if (*json=='\\') *into++=*json++; 1522 | *into++=*json++; 1523 | } 1524 | *into++=*json++; 1525 | } 1526 | else *into++=*json++; 1527 | } 1528 | *into=0; 1529 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/JSON.h: -------------------------------------------------------------------------------- 1 | #ifndef cJSON__h 2 | #define cJSON__h 3 | #ifdef __cplusplus 4 | extern "C" 5 | { 6 | #endif 7 | #define cJSON_StringIsConst 512 8 | #define cJSON_IsReference 256 9 | #define JSON_OBJECT 6 10 | #define JSON_ARRAY 5 11 | #define JSON_STRING 4 12 | #define JSON_NUM 3 13 | #define JSON_NULL 2 14 | #define JSON_TRUE 1 15 | #define JSON_FALSE 0 16 | typedef struct cJSON 17 | { 18 | struct cJSON *next,*prev; 19 | struct cJSON *child; 20 | int type; 21 | int valueint; 22 | char *string; 23 | char *valuestring; 24 | double valuedouble; 25 | } cJSON; 26 | typedef struct JSON_gouzi 27 | { 28 | void (*free_fn)(void *ptr); 29 | void *(*malloc_fn)(size_t sz); 30 | } JSON_gouzi ; 31 | extern void JSON_csh_gouzi(JSON_gouzi * hooks); 32 | extern cJSON *JSON_Par(const char *value); 33 | extern char *JSON_prt(cJSON *item); 34 | extern char *JSON_puf(cJSON *item); 35 | extern char *JSON_pbuf(cJSON *item,int prebuffer,int fmt); 36 | extern void JSON_shanchu(cJSON *c); 37 | extern int JSON_Get_Arr_Siz(cJSON *array); 38 | extern cJSON *JSON_Get_Arr_Item(cJSON *array,int item); 39 | extern cJSON *JSON_Get_Obj_Item(cJSON *object,const char *string); 40 | extern const char *JSON_cuowuzhizhen(void); 41 | extern cJSON *JSON_Cre_Null(void); 42 | extern cJSON *JSON_Cre_True(void); 43 | extern cJSON *JSON_Cre_False(void); 44 | extern cJSON *JSON_Cre_Bool(int b); 45 | extern cJSON *JSON_Cre_Num(double num); 46 | extern cJSON *JSON_Cre_Obj(void); 47 | extern cJSON *JSON_Cre_Str(const char *string); 48 | extern cJSON *JSON_Cre_Arr(void); 49 | extern cJSON *JSON_Cre_Int_Arr(const int *numbers,int count); 50 | extern cJSON *JSON_Cre_Double_Arr(const double *numbers,int count); 51 | extern void JSON_Add_Item_To_Obj(cJSON *object,const char *string,cJSON *item); 52 | extern cJSON *JSON_Cre_Str_Arr(const char **strings,int count); 53 | extern void JSON_Add_Item_To_Arr(cJSON *array, cJSON *item); 54 | extern cJSON *JSON_Cre_Float_Arr(const float *numbers,int count); 55 | extern void JSON_Add_Item_To_Obj_CS(cJSON *object,const char *string,cJSON *item); 56 | extern void JSON_Add_Item_Ref_To_Arr(cJSON *array, cJSON *item); 57 | extern void JSON_Add_Item_Ref_To_Obj(cJSON *object,const char *string,cJSON *item); 58 | extern void JSON_Del_Item_From_Arr(cJSON *array,int which); 59 | extern cJSON *JSON_Det_Item_From_Arr(cJSON *array,int which); 60 | extern cJSON *JSON_Det_Item_From_Obj(cJSON *object,const char *string); 61 | extern void JSON_Ins_Item_In_Arr(cJSON *array,int which,cJSON *newitem); 62 | extern void JSON_Rep_Item_In_Arr(cJSON *array,int which,cJSON *newitem); 63 | extern void JSON_Del_Item_From_Obj(cJSON *object,const char *string); 64 | extern void JSON_Rep_Item_In_Obj(cJSON *object,const char *string,cJSON *newitem); 65 | extern cJSON *JSON_Dup(cJSON *item,int recurse); 66 | extern cJSON *JSON_Par_wit(const char *value,const char **return_parse_end,int req_null_ter); 67 | extern void JSON_Minify(char *json); 68 | #define cJSON_AddNullToObject(object,name) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Null()) 69 | #define cJSON_AddTrueToObject(object,name) JSON_Add_Item_To_Obj(object, name, JSON_Cre_True()) 70 | #define cJSON_AddFalseToObject(object,name) JSON_Add_Item_To_Obj(object, name, JSON_Cre_False()) 71 | #define cJSON_AddBoolToObject(object,name,b) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Bool(b)) 72 | #define cJSON_AddNumberToObject(object,name,n) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Num(n)) 73 | #define cJSON_AddStringToObject(object,name,s) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Str(s)) 74 | #define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) 75 | #define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) 76 | #ifdef __cplusplus 77 | } 78 | #endif 79 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/List.h: -------------------------------------------------------------------------------- 1 | #ifndef LIST_H_ 2 | #define LIST_H_ 3 | #include 4 | #include 5 | #define List_Init(list, list_node_t) {list=(list_node_t*)malloc(sizeof(list_node_t));(list)->next=NULL;} 6 | #define List_Free(list, list_node_t) {assert(NULL!=list);list_node_t *tmpPtr;while(NULL!=(tmpPtr=(list)->next)){(list)->next=tmpPtr->next;free(tmpPtr);}} 7 | #define List_Destroy(list, list_node_t) {assert(NULL!=list);List_Free(list, list_node_t)free(list); (list)=NULL;} 8 | #define List_For_Each(list, cur_Pos)for ( cur_Pos = (list)->next;cur_Pos != NULL;cur_Pos=cur_Pos->next) 9 | #define List_AddHead(list, newNode) {(newNode)->next=(list)->next;(list)->next=newNode;} 10 | #define List_AddTail(list, cur_Pos ,newNode) {for(cur_Pos = (list); ;cur_Pos=cur_Pos->next){if((cur_Pos)->next == NULL){(cur_Pos)->next = (newNode);break;}}} 11 | #define List_InsertBefore(node, newNode) {(newNode)->prev=(node)->prev;(node)->prev->next=newNode;(node)->prev=newNode;(newNode)->next=node;} 12 | #define List_InsertAfter(node, newNode) {(newNode)->next=node->next;(node)->next=newNode;} 13 | #define List_IsEmpty(list) (((list) != NULL) 14 | #define List_FreeNode(head ,node,list_node_t) {assert(NULL!=node);if(node -> next != NULL){list_node_t *temp = node->next;memcpy(node,temp,sizeof(list_node_t));free(temp); }else{list_node_t *temp = head;while(temp -> next != node) temp = temp -> next; temp -> next = NULL;free(node); node = NULL; }} 15 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/decode.c: -------------------------------------------------------------------------------- 1 | #include 2 | int jiemazhi(char input_val) 3 | { 4 | static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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}; 5 | static const char decoding_size = sizeof(decoding); 6 | input_val -= 43; 7 | if (input_val < 0 || input_val > decoding_size) 8 | { 9 | return -1; 10 | } 11 | return decoding[(int)input_val]; 12 | } 13 | void chushihua(W64jiema* input_sta) 14 | { 15 | input_sta->p_char = 0; 16 | input_sta->step = step_1; 17 | } 18 | int jiemakuai(const char* input_code, const int input_len, char* output_pla, W64jiema* input_sta) 19 | { 20 | char fenduan; 21 | char* p_char = output_pla; 22 | const char* cod_char = input_code; 23 | *p_char = input_sta->p_char; 24 | switch (input_sta->step) 25 | { 26 | while (1) 27 | { 28 | case step_1: 29 | do { 30 | if (input_code+input_len==cod_char) 31 | { 32 | input_sta->p_char = *p_char; 33 | input_sta->step = step_1; 34 | return p_char - output_pla; 35 | } 36 | fenduan = (char)jiemazhi(*cod_char++); 37 | } while (fenduan < 0); 38 | *p_char = (fenduan & 0x03f) << 2; 39 | case step_2: 40 | do { 41 | if (input_code+input_len==cod_char) 42 | { 43 | input_sta->p_char = *p_char; 44 | input_sta->step = step_2; 45 | return p_char - output_pla; 46 | } 47 | fenduan = (char)jiemazhi(*cod_char++); 48 | } while (fenduan < 0); 49 | *p_char++ |= (fenduan & 0x030) >> 4; 50 | *p_char = (fenduan & 0x00f) << 4; 51 | case step_3: 52 | do { 53 | if (input_code+input_len==cod_char) 54 | { 55 | input_sta->p_char = *p_char; 56 | input_sta->step = step_3; 57 | return p_char - output_pla; 58 | } 59 | fenduan = (char)jiemazhi(*cod_char++); 60 | } while (fenduan < 0); 61 | *p_char++ |= (fenduan & 0x03c) >> 2; 62 | *p_char = (fenduan & 0x003) << 6; 63 | case step_4: 64 | do { 65 | if (input_code+input_len==cod_char) 66 | { 67 | input_sta->p_char = *p_char; 68 | input_sta->step = step_4; 69 | return p_char - output_pla; 70 | } 71 | fenduan = (char)jiemazhi(*cod_char++); 72 | } while (fenduan < 0); 73 | *p_char++ |= (fenduan & 0x03f); 74 | } 75 | } 76 | return p_char - output_pla; 77 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/decode.h: -------------------------------------------------------------------------------- 1 | #ifndef BASE64_CDECODE_H 2 | #define BASE64_CDECODE_H 3 | typedef enum 4 | { 5 | step_1, step_2, step_3, step_4 6 | } W64jiemabuzhou; 7 | 8 | typedef struct 9 | { 10 | char p_char; 11 | W64jiemabuzhou step; 12 | } W64jiema; 13 | int jiemakuai(const char* input_code, const int input_len, char* output_pla, W64jiema* input_sta); 14 | int jiemazhi(char input_val); 15 | void chushihua(W64jiema* input_sta); 16 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/encode.c: -------------------------------------------------------------------------------- 1 | #include 2 | const int hangzifushu = 75;//e//fanhui// 3 | void chushihua2(W64bianmazhuangtai* input_sta) 4 | { 5 | input_sta->step = step_a; 6 | input_sta->res_a = 0; 7 | input_sta->ste_a = 0; 8 | } 9 | char bianmazhi(char input_val) 10 | { 11 | static const char* encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 12 | if (input_val >= 64) 13 | { 14 | return '='; 15 | } 16 | return encoding[(int)input_val]; 17 | } 18 | int bianmakuai(const char* input_pla2, int input_len, char* output_cod, W64bianmazhuangtai* input_sta) 19 | { 20 | const char* p_char = input_pla2; 21 | const char* const mingwen_end = input_pla2 + input_len; 22 | char fenduan; 23 | char res_a; 24 | char* cod_char = output_cod; 25 | res_a = input_sta->res_a; 26 | switch (input_sta->step) 27 | { 28 | while (1) 29 | { 30 | case step_a: 31 | if (mingwen_end==p_char) 32 | { 33 | input_sta->res_a = res_a; 34 | input_sta->step = step_a; 35 | return cod_char - output_cod; 36 | } 37 | fenduan = *p_char++; 38 | res_a = (fenduan & 0x0fc) >> 2; 39 | *cod_char++ = bianmazhi(res_a); 40 | res_a = (fenduan & 0x003) << 4; 41 | case step_b: 42 | if (mingwen_end==p_char) 43 | { 44 | input_sta->res_a = res_a; 45 | input_sta->step = step_b; 46 | return cod_char - output_cod; 47 | } 48 | fenduan = *p_char++; 49 | res_a |= (fenduan & 0x0f0) >> 4; 50 | *cod_char++ = bianmazhi(res_a); 51 | res_a = (fenduan & 0x00f) << 2; 52 | case step_c: 53 | if (mingwen_end==p_char) 54 | { 55 | input_sta->res_a = res_a; 56 | input_sta->step = step_c; 57 | return cod_char - output_cod; 58 | } 59 | fenduan = *p_char++; 60 | res_a |= (fenduan & 0x0c0) >> 6; 61 | *cod_char++ = bianmazhi(res_a); 62 | res_a = (fenduan & 0x03f) >> 0; 63 | *cod_char++ = bianmazhi(res_a); 64 | ++(input_sta->ste_a); 65 | if (hangzifushu/4==input_sta->ste_a) 66 | { 67 | *cod_char++ = '\n'; 68 | input_sta->ste_a = 0; 69 | } 70 | } 71 | } 72 | return cod_char - output_cod; 73 | } 74 | int bianmakuai2(char* output_cod, W64bianmazhuangtai* input_sta) 75 | { 76 | char* cod_char = output_cod; 77 | switch (input_sta->step) 78 | { 79 | case step_b: 80 | *cod_char++ = bianmazhi(input_sta->res_a); 81 | *cod_char++ = '='; 82 | break; 83 | case step_c: 84 | *cod_char++ = bianmazhi(input_sta->res_a); 85 | *cod_char++ = '='; 86 | break; 87 | case step_a: 88 | break; 89 | } 90 | *cod_char++ = '\n'; 91 | return cod_char - output_cod; 92 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/src/encode.h: -------------------------------------------------------------------------------- 1 | #ifndef BASE64_CENCODE_H 2 | #define BASE64_CENCODE_H 3 | typedef enum 4 | { 5 | step_a, step_b, step_c 6 | } W64bianmabuzhou; 7 | 8 | typedef struct 9 | { 10 | int ste_a; 11 | char res_a; 12 | W64bianmabuzhou step; 13 | } W64bianmazhuangtai; 14 | int bianmakuai(const char* input_pla2, int input_len, char* output_cod, W64bianmazhuangtai* input_sta); 15 | int bianmakuai2(char* output_cod, W64bianmazhuangtai* input_sta); 16 | char bianmazhi(char input_val); 17 | void chushihua2(W64bianmazhuangtai* input_sta); 18 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/ACC_UI.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "./ACC_UI.h" 3 | #include "../service/ACC_SRV.h" 4 | #include "../src/Common.h" 5 | int ACC_UI_SIG() 6 | { 7 | int sex; 8 | char name[30] , password[30]; 9 | printf("请输入你准备注册的用户名:"); 10 | scanf("%30s",name); 11 | cc_Clear(); 12 | while(1) 13 | { 14 | printf("请输入性别(男/女):"); 15 | scanf("%30s",password); 16 | cc_Clear(); 17 | if(strcmp(password ,"男") == 0) 18 | { 19 | sex = 1; 20 | break; 21 | } 22 | else if(strcmp(password ,"女") == 0) 23 | { 24 | sex = 0; 25 | break; 26 | } 27 | else 28 | { 29 | printf("啊这...难道您就是传说中的不男不女?!\n"); 30 | } 31 | } 32 | printf("输入你的密码:"); 33 | scanf("%s",password); 34 | cc_Clear(); 35 | return Acc_Srv_sig(name ,sex ,password); 36 | } 37 | int ACC_UI_LOG() 38 | { 39 | char name[30] , password[30]; 40 | printf("请输入你的用户名:"); 41 | scanf("%s",name); 42 | cc_Clear(); 43 | printf("请输入你的密码:"); 44 | scanf("%s",password); 45 | cc_Clear(); 46 | return Acc_Srv_Log(name , password); 47 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/ACC_UI.h: -------------------------------------------------------------------------------- 1 | #ifndef _ACCOUNT_UI_H 2 | #define _ACCOUNT_UI_H 3 | #include 4 | #include 5 | #include 6 | int ACC_UI_SIG(); 7 | int ACC_UI_LOG(); 8 | void Account_UI_ChInfo(); 9 | void Account_UI_Password(); 10 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/CHAT_UI.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include"./GROUP_UI.h" 5 | #include"../src/Common.h" 6 | #include"../service/CHAT_SRV.h" 7 | #include"../service/FRI_SRV.h" 8 | #include"../service/GROUP_SRV.h" 9 | #include"../src/List.h" 10 | extern friends_t * fri_list; 11 | extern group_t * group_list; 12 | extern int gl_uid; 13 | extern private_msg_t* Pri_msg_list; 14 | extern group_msg_t* group_msg_list; 15 | group_t *curGroup = NULL; 16 | void Chat_UI_Priva() 17 | { 18 | friends_t *cur_Fri = NULL; 19 | char fname[30]; 20 | char msg[1000]; 21 | friends_t * f; 22 | while(1) 23 | { 24 | printf("请输入你的好友用户名:"); 25 | scanf("%30s",fname); 26 | cc_Clear(); 27 | List_For_Each(fri_list ,f) 28 | { 29 | if(strcmp(f->name ,fname) == 0) 30 | { 31 | cur_Fri = f; 32 | } 33 | } 34 | if(cur_Fri == NULL ) 35 | { 36 | printf("%s ta不是你的好友." , fname); 37 | getchar(); 38 | return; 39 | }else 40 | { 41 | break; 42 | } 43 | } 44 | int this_msg_num; 45 | private_msg_t * m; 46 | do 47 | { 48 | system("clear"); 49 | printf( " @ 私聊 @\n"); 50 | this_msg_num = 0; 51 | List_For_Each(Pri_msg_list ,m) 52 | { 53 | if(m -> from_uid == gl_uid || m -> from_uid == cur_Fri -> uid) 54 | { 55 | this_msg_num +=1; 56 | } 57 | } 58 | 59 | List_For_Each(Pri_msg_list ,m) 60 | { 61 | if( m-> from_uid == cur_Fri -> uid ) 62 | { 63 | if(this_msg_num > 10) 64 | { 65 | List_FreeNode(Pri_msg_list ,m ,private_msg_t); 66 | this_msg_num -=1; 67 | } 68 | else 69 | { 70 | printf("\t\e[31m%s\e[0m ",m->time); 71 | printf("%s\n",m -> name); 72 | printf("\t \e[1m%s\e[0m\n",m -> msg); 73 | 74 | } 75 | } 76 | else if(m -> from_uid == gl_uid) 77 | { 78 | if(this_msg_num > 10) 79 | { 80 | List_FreeNode(Pri_msg_list ,m ,private_msg_t); 81 | this_msg_num -=1; 82 | } 83 | else 84 | { 85 | printf("\t\e[32m%s\e[0m ",m->time); 86 | printf("本人\n"); 87 | printf("\t \e[1m%s\e[0m\n",m -> msg); 88 | } 89 | } 90 | } 91 | printf( "########################################\n" 92 | "# /fanhui : 返回上一级 #\n" 93 | "# /fasong : 发送文件 #\n" 94 | "# /jilu : 聊天记录 #\n" 95 | "# 回车 : 发送/刷新消息 #\n" 96 | "########################################\n"); 97 | printf("消息/功能:"); 98 | sgets(msg ,1000); 99 | if(*msg == '\0') 100 | { 101 | continue; 102 | } 103 | else if(strcmp(msg,"/fanhui") == 0) 104 | { 105 | cur_Fri -> NewMsgNum = 0; 106 | return; 107 | } 108 | else if(strcmp(msg,"/fasong") == 0) 109 | { 110 | if(cur_Fri -> is_online == 0) 111 | { 112 | printf("好友不在线,无法发送!\n"); 113 | getchar(); 114 | continue; 115 | } 116 | char filename[100]; 117 | while(1) 118 | { 119 | printf("输入你的文件路径:"); 120 | sgets(filename ,100); 121 | if(*filename == '\0') 122 | { 123 | break; 124 | } 125 | if(Chat_Srv_Send_File(filename ,cur_Fri -> uid)) 126 | { 127 | printf("发送成功!"); 128 | } 129 | getchar(); 130 | break; 131 | } 132 | } 133 | else if(strcmp(msg,"/jilu") == 0) 134 | { 135 | Chat_Srv_Get_Priva_Rec(cur_Fri -> uid); 136 | getchar(); 137 | } 138 | else 139 | { 140 | Chat_Srv_Send_Priva(cur_Fri -> uid,msg); 141 | } 142 | }while(1); 143 | } 144 | 145 | void Chat_UI_Group() 146 | { 147 | group_t *g = NULL; 148 | char msg[1000]; 149 | char gname[30]; 150 | while(1){ 151 | printf("请输群名称:"); 152 | scanf("%s",gname); 153 | cc_Clear(); 154 | List_For_Each(group_list ,g) 155 | { 156 | if(strcmp(g->name ,gname) == 0) 157 | { 158 | curGroup = g; 159 | } 160 | } 161 | if(curGroup == NULL ) 162 | { 163 | printf("你不在群聊 %s " , gname); 164 | getchar(); 165 | return; 166 | } 167 | else 168 | { 169 | break; 170 | } 171 | } 172 | int this_msg_num; 173 | group_msg_t * m; 174 | do 175 | { 176 | if(curGroup == NULL) 177 | { 178 | return; 179 | } 180 | system("clear"); 181 | printf( "########################################\n" 182 | " # 群聊 #\n" 183 | "########################################\n"); 184 | this_msg_num = 0; 185 | List_For_Each(group_msg_list ,m) 186 | { 187 | if(m -> gid == curGroup -> gid || m -> from_uid == gl_uid) 188 | { 189 | this_msg_num +=1; 190 | } 191 | } 192 | 193 | List_For_Each(group_msg_list ,m) 194 | { 195 | if( m-> gid == curGroup -> gid ) 196 | { 197 | if(this_msg_num > 10) 198 | { 199 | List_FreeNode(group_msg_list ,m ,group_msg_t); 200 | this_msg_num -=1; 201 | } 202 | else 203 | { 204 | if(m -> from_uid == gl_uid) 205 | { 206 | printf("\t\e[32m%s\e[0m ",m->time); 207 | printf("本人\n"); 208 | printf("\t \e[1m%s\e[0m\n",m -> msg); 209 | } 210 | else 211 | { 212 | printf("\t\e[31m%s\e[0m ",m->time); 213 | printf("%s\n",m -> uname); 214 | printf("\t \e[1m%s\e[0m\n",m -> msg); 215 | } 216 | } 217 | } 218 | } 219 | printf( "########################################################\n" 220 | "/fanhui 返回上一页| /jilu 聊天记录| /chengyuan 查看群成员\n" 221 | "/yaoqing 邀请好友 | /tui 退/解散群 | 回车 发送/刷新\n" 222 | "########################################################\n"); 223 | printf("命令:"); 224 | sgets(msg ,1000); 225 | if(*msg == '\0') 226 | { 227 | continue; 228 | } 229 | else if(strcmp(msg,"/fanhui") == 0) 230 | { 231 | curGroup -> NewMsgNum = 0; 232 | return; 233 | } 234 | else if(strcmp(msg ,"/jilu") == 0) 235 | { 236 | //Chat_Srv_Get_Priva_Rec(cur_Fri -> uid); 237 | //getchar(); 238 | } 239 | else if(strcmp(msg ,"/chengyuan") == 0) 240 | { 241 | system("clear"); 242 | printf("群成员列表(%s):\n", curGroup-> name); 243 | Group_Srv_Get_Member(curGroup -> gid); 244 | sleep(1); 245 | getchar(); 246 | } 247 | else if(strcmp(msg ,"/yaoqing") == 0) 248 | { 249 | Gro_UI_Add_Mem(curGroup -> gid); 250 | } 251 | else if(strcmp(msg ,"/tui") == 0) 252 | { 253 | Gro_Srv_Quit(curGroup); 254 | curGroup = NULL; 255 | } 256 | else 257 | { 258 | Chat_Srv_Send_Group(curGroup -> gid,msg); 259 | } 260 | }while(1); 261 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/CHAT_UI.h: -------------------------------------------------------------------------------- 1 | #ifndef _CHAT_UI_H 2 | #define _CHAT_UI_H 3 | void Chat_UI_Priva(); 4 | void Chat_UI_Group(); 5 | #endif 6 | -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/FRI_UI.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "FRI_UI.h" 3 | #include "./ACC_UI.h" 4 | #include "../src/List.h" 5 | #include "../service/FRI_SRV.h" 6 | extern friends_t *fri_list; 7 | extern int Pri_msg_num; 8 | extern int gl_uid; 9 | int f_num = 0 ,online_num = 0 ,a_num = 0; 10 | void Fri_UI_Show_List() 11 | { 12 | friends_t *cur_Pos = NULL; 13 | printf("$$ 我的好友(%d/%d)\n",online_num ,f_num); 14 | f_num = online_num = 0; 15 | char *is_online[2] = {"@","\e[32m@\e[0m"}; 16 | char *is_vip[2] = {"","\e[31m"}; 17 | char *sex[2] = {"\e[35m女\e[0m","\e[36m男\e[0m"}; 18 | char *is_follow[2] = {"","\e[31m!\e[0m"}; 19 | char is_msg[2][20]={"",""}; 20 | List_For_Each(fri_list ,cur_Pos) 21 | { 22 | if(cur_Pos -> state != 1) 23 | { 24 | a_num +=1; 25 | continue; 26 | } 27 | f_num +=1; 28 | if(cur_Pos->is_online) 29 | { 30 | online_num +=1; 31 | } 32 | sprintf(is_msg[0],"(\e[31m%d\e[0m)" ,cur_Pos -> NewMsgNum); 33 | printf(" %s %s%s\e[0m %s %s %s\n" ,is_online[cur_Pos->is_online] ,is_vip[cur_Pos->is_vip],cur_Pos -> name ,sex[cur_Pos->sex] ,is_follow[cur_Pos->is_follow],is_msg[(cur_Pos->NewMsgNum == 0)]); 34 | } 35 | } 36 | void Friends_UI_ShowApply() 37 | { 38 | printf("$$ 申请列表(%d)\n" ,a_num); 39 | a_num = 0; 40 | friends_t *cur_Pos; 41 | List_For_Each(fri_list ,cur_Pos) 42 | { 43 | if(cur_Pos -> state != 0 || cur_Pos -> uid == gl_uid) 44 | { 45 | continue; 46 | } 47 | printf(" %s 申请加你为好友\n",cur_Pos->name); 48 | } 49 | } 50 | void Friends_UI_Add() 51 | { 52 | char fname[30]; 53 | printf("请输入添加好友名:"); 54 | scanf("%30s",fname); 55 | cc_Clear(); 56 | friends_t *f; 57 | List_For_Each(fri_list ,f) 58 | { 59 | if(strcmp(f->name ,fname) == 0) 60 | { 61 | printf("%s 已经成为你的好友了!",fname); 62 | getchar(); 63 | return; 64 | } 65 | } 66 | Fri_Srv_Send_Add(fname); 67 | } 68 | 69 | void Friends_UI_Apply() 70 | { 71 | friends_t *f; 72 | char choice; 73 | List_For_Each(fri_list ,f) 74 | { 75 | if(f -> state != 0) 76 | { 77 | continue; 78 | } 79 | printf("是否同意 %s 的好友请求?\n请输入:(Y/N)", f->name); 80 | scanf("%c",&choice); 81 | if(choice == 'y') 82 | { 83 | Fri_Srv_App(f -> uid ,gl_uid ,1); 84 | f -> state = 1; 85 | } 86 | else if(choice == 'n') 87 | { 88 | Fri_Srv_App(f->uid ,gl_uid ,0); 89 | List_FreeNode(fri_list ,f ,friends_t); 90 | } 91 | } 92 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/FRI_UI.h: -------------------------------------------------------------------------------- 1 | #ifndef _FRIENDS_UI_H 2 | #define _FRIENDS_UI_H 3 | void Fri_UI_Show_List(); 4 | void Friends_UI_Add(); 5 | void Friends_UI_ShowApply(); 6 | void Friends_UI_Apply(); 7 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/GROUP_UI.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "./GROUP_UI.h" 4 | #include "../src/Common.h" 5 | #include "../src/List.h" 6 | #include "../service/GROUP_SRV.h" 7 | #include "../service/FRI_SRV.h" 8 | extern group_t *group_list; 9 | extern friends_t *fri_list; 10 | void Gro_UI_Cre() 11 | { 12 | char gname[30]; 13 | printf("输入创建群名称:"); 14 | sgets(gname,30); 15 | Gro_Srv_Cre(gname); 16 | } 17 | void Group_UI_ShowList() 18 | { 19 | static int g_num = 0; 20 | printf("$$ 群聊(%d)\n" ,g_num); 21 | g_num = 0; 22 | group_t * g; 23 | List_For_Each(group_list ,g) 24 | { 25 | printf(" %s",g -> name); 26 | if(g -> NewMsgNum > 0) 27 | { 28 | printf(" (\e[31m%d\e[0m)",g -> NewMsgNum); 29 | } 30 | printf("\n"); 31 | g_num +=1; 32 | } 33 | } 34 | 35 | void Gro_UI_Add_Mem(int gid) 36 | { 37 | char name[30]; 38 | printf("输入邀请好友名:"); 39 | scanf("%30s",name); 40 | cc_Clear(); 41 | friends_t *f; 42 | List_For_Each(fri_list ,f) 43 | { 44 | if(strcmp(f -> name ,name) == 0) break; 45 | } 46 | if(f == NULL) 47 | { 48 | printf("%s 不是你好友,没法邀请" ,name); 49 | getchar(); 50 | return; 51 | } 52 | Gro_Srv_Add_Mem(gid ,f -> uid); 53 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/GROUP_UI.h: -------------------------------------------------------------------------------- 1 | #ifndef _GROUP_UI_H 2 | #define _GROUP_UI_H 3 | void Group_UI_ShowList(); 4 | void Gro_UI_Cre(); 5 | void Gro_UI_Add_Mem(int gid); 6 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/MAIN_UI.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "./MAIN_UI.h" 3 | #include "./ACC_UI.h" 4 | #include "./FRI_UI.h" 5 | #include "./CHAT_UI.h" 6 | #include "./GROUP_UI.h" 7 | #include "../service/ACC_SRV.h" 8 | #include "../service/FRI_SRV.h" 9 | #include "../service/CHAT_SRV.h" 10 | #include "../service/GROUP_SRV.h" 11 | extern int gl_uid; 12 | void Main_UI_Hello() 13 | { 14 | int choice; 15 | do{ 16 | if(gl_uid > 0) 17 | { 18 | Main_UI_Menu(); 19 | } 20 | system("clear"); 21 | printf("\t1.登录\n""\t2.注册\n""\t3.退出\n""命令行:"); 22 | scanf("%d" , &choice); 23 | cc_Clear(); 24 | switch(choice) 25 | { 26 | case 1: 27 | gl_uid = ACC_UI_LOG(); 28 | break; 29 | case 2: 30 | ACC_UI_SIG(); 31 | break; 32 | case 3: 33 | return; 34 | break; 35 | default: 36 | break; 37 | } 38 | }while(1); 39 | } 40 | void Main_UI_Menu() 41 | { 42 | Chat_Srv_Init_List(); 43 | Fri_Srv_Get_List(); 44 | Gro_Srv_Get_List(); 45 | char choice; 46 | do{ 47 | system("clear"); 48 | Fri_UI_Show_List(); 49 | Group_UI_ShowList(); 50 | Friends_UI_ShowApply(); 51 | printf( "###############################\n"); 52 | printf( "1.选择好友|2.选择群聊|3.申请批准\n" 53 | "4.好友添加|5.群聊创建|6.注销登录\n"); 54 | printf( "###############################\n" "命令行:"); 55 | scanf("%c",&choice); 56 | if(choice == '\n') 57 | { 58 | continue; 59 | } 60 | cc_Clear(); 61 | switch(choice) 62 | { 63 | case '1': 64 | Chat_UI_Priva(); 65 | break; 66 | case '2': 67 | Chat_UI_Group(); 68 | break; 69 | case '3': 70 | Friends_UI_Apply(); 71 | break; 72 | case '4': 73 | Friends_UI_Add(); 74 | break; 75 | case '5': 76 | Gro_UI_Cre(); 77 | break; 78 | case '6': 79 | Acc_Srv_Out(gl_uid); 80 | break; 81 | } 82 | }while(choice != '6'); 83 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Client/ui/MAIN_UI.h: -------------------------------------------------------------------------------- 1 | #ifndef _MAIN_UI_H 2 | #define _MAIN_UI_H 3 | void Main_UI_Hello(); 4 | void Main_UI_Menu(); 5 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/Makefile: -------------------------------------------------------------------------------- 1 | #!Makefile 2 | PROGRAM = srv 3 | C_SOURCES = $(shell find . -name "*.c") 4 | C_OBJECTS = $(patsubst %.c, %.o, $(C_SOURCES)) 5 | CC = gcc 6 | C_FLAGS = -DDEBUG -c -Wall -Wextra -ggdb3 -I. 7 | all: $(C_OBJECTS) 8 | @echo link... 9 | $(CC) $(C_OBJECTS) -lm -lpthread -L/usr/lib64/mysql -lmysqlclient -o $(PROGRAM) 10 | .c.o: 11 | @echo compile $< ... 12 | $(CC) $(C_FLAGS) $< -o $@ 13 | .PHONY:clean 14 | clean: 15 | $(RM) $(C_OBJECTS) srv -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/chat_room.sql: -------------------------------------------------------------------------------- 1 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 2 | SET AUTOCOMMIT = 0; 3 | START TRANSACTION; 4 | SET time_zone = "+00:00"; 5 | CREATE DATABASE IF NOT EXISTS `chat_room` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 6 | USE `chat_room`; 7 | CREATE TABLE `account` 8 | ( 9 | `uid` int(11) NOT NULL, 10 | `name` varchar(10) NOT NULL, 11 | `sex` int(11) NOT NULL, 12 | `is_vip` int(11) NOT NULL, 13 | `is_online` int(11) NOT NULL, 14 | `password` varchar(33) NOT NULL 15 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 16 | CREATE TABLE `friends` 17 | ( 18 | `uid` int(11) NOT NULL, 19 | `fuid` int(11) NOT NULL, 20 | `is_follow` int(11) NOT NULL, 21 | `state` int(11) NOT NULL 22 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 23 | CREATE TABLE `groups` 24 | ( 25 | `gid` int(11) NOT NULL, 26 | `name` varchar(20) NOT NULL, 27 | `owner` int(11) NOT NULL COMMENT '群主uid', 28 | `num` int(11) NOT NULL COMMENT '群成员数量' 29 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 30 | CREATE TABLE `group_member` 31 | ( 32 | `gid` int(11) NOT NULL, 33 | `uid` int(11) NOT NULL, 34 | `permission` int(11) NOT NULL, 35 | `noname` int(11) NOT NULL 36 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 37 | CREATE TABLE `group_rec` 38 | ( 39 | `gid` int(11) NOT NULL, 40 | `uid` int(11) NOT NULL, 41 | `msg` varchar(300) NOT NULL, 42 | `offlist` varchar(20) NOT NULL 43 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 44 | CREATE TABLE `private_rec` 45 | ( 46 | `from_uid` int(11) NOT NULL, 47 | `to_uid` int(11) NOT NULL, 48 | `msg` varchar(300) NOT NULL, 49 | `is_offline` int(11) NOT NULL 50 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 51 | ALTER TABLE `account` 52 | ADD PRIMARY KEY (`uid`); 53 | ALTER TABLE `friends` 54 | ADD PRIMARY KEY (`uid`,`fuid`); 55 | ALTER TABLE `groups` 56 | ADD PRIMARY KEY (`gid`); 57 | ALTER TABLE `group_member` 58 | ADD PRIMARY KEY (`gid`,`uid`); 59 | ALTER TABLE `account` 60 | MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; 61 | ALTER TABLE `groups` 62 | MODIFY `gid` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; 63 | COMMIT; -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "port": 1314, 3 | "host": "127.0.0.1", 4 | "user": "linuxcc", 5 | "pass": "linuxcc", 6 | "database": "chat_room" 7 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/ACC_SRV.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "./ACC_SRV.h" 8 | #include "./CHAT_SRV.h" 9 | #include "./FRI_SRV.h" 10 | #include "../srvv/ACC_PER.h" 11 | #include "../srvv/FRI_PER.h" 12 | #include "../src/JSON.h" 13 | #include "../src/List.h" 14 | #define MSG_LEN 1024 15 | extern online_t * Onl_List; 16 | 17 | int ACC_SRV_SEND_ONL(int uid ,int is_online) 18 | { 19 | int f_sock_fd; 20 | friends_t *fri_list ,*f; 21 | List_Init(fri_list ,friends_t); 22 | Fri_Per_Get_List(fri_list ,uid); 23 | List_For_Each(fri_list ,f) 24 | { 25 | if(f->is_online) 26 | { 27 | f_sock_fd = Chat_Srv_Get_Fri_Sock(f->uid); 28 | if(f_sock_fd == -1) 29 | { 30 | return 0; 31 | } 32 | cJSON *root = JSON_Cre_Obj(); 33 | cJSON *item = JSON_Cre_Str("I"); 34 | JSON_Add_Item_To_Obj(root ,"type" ,item); 35 | item = JSON_Cre_Num(uid); 36 | JSON_Add_Item_To_Obj(root ,"fuid",item); 37 | item = JSON_Cre_Bool(is_online); 38 | JSON_Add_Item_To_Obj(root ,"is_online",item); 39 | char *out = JSON_prt(root); 40 | JSON_shanchu(root); 41 | if(send(f_sock_fd ,(void *)out ,MSG_LEN ,0) <= 0) 42 | { 43 | perror("send 客户端响应失败"); 44 | free(out); 45 | return 0; 46 | } 47 | free(out); 48 | } 49 | } 50 | List_Destroy(fri_list, friends_t); 51 | return 1; 52 | } 53 | int Acc_Srv_Ch_Onl(int uid ,int is_online ,int sockfd) 54 | { 55 | int rtn = 0; 56 | online_t *cur_Pos; 57 | if(is_online) 58 | { 59 | List_For_Each(Onl_List ,cur_Pos) 60 | { 61 | if(cur_Pos -> uid == uid) 62 | { 63 | close(cur_Pos -> sockfd); 64 | cur_Pos -> sockfd = sockfd; 65 | rtn = 1; 66 | goto per; 67 | } 68 | } 69 | cur_Pos = (online_t *)malloc(sizeof(online_t)); 70 | cur_Pos -> uid = uid; 71 | cur_Pos -> sockfd = sockfd; 72 | cur_Pos -> next = NULL; 73 | List_AddHead(Onl_List ,cur_Pos); 74 | rtn = 1; 75 | } 76 | else 77 | { 78 | List_For_Each(Onl_List ,cur_Pos) 79 | { 80 | if(cur_Pos -> sockfd == sockfd) 81 | { 82 | uid = rtn = cur_Pos -> uid; 83 | List_FreeNode(Onl_List ,cur_Pos ,online_t); 84 | break; 85 | } 86 | } 87 | } 88 | if(uid == -1) 89 | { 90 | return 0; 91 | } 92 | per: if(Acc_Per_Ch_Is_Onl(uid ,is_online) == 0) 93 | { 94 | rtn = 0; 95 | } 96 | return rtn; 97 | } 98 | int Acc_Srv_Out(int sockfd ,char *JSON) 99 | { 100 | int rtn; 101 | int uid; 102 | cJSON *root = JSON_Par(JSON); 103 | cJSON *item = JSON_Get_Obj_Item(root ,"uid"); 104 | uid = item -> valueint; 105 | JSON_shanchu(root); 106 | rtn = Acc_Srv_Ch_Onl(uid ,0 ,sockfd); 107 | if(rtn != -1) 108 | { 109 | ACC_SRV_SEND_ONL(uid ,0); 110 | } 111 | root = JSON_Cre_Obj(); 112 | item = JSON_Cre_Str("R"); 113 | JSON_Add_Item_To_Obj(root ,"type" ,item); 114 | item = JSON_Cre_Bool((rtn > 0)); 115 | JSON_Add_Item_To_Obj(root ,"res",item); 116 | item = JSON_Cre_Str("服务器异常?"); 117 | JSON_Add_Item_To_Obj(root , "reason" ,item); 118 | char *out = JSON_prt(root); 119 | if(send(sockfd ,(void*)out , MSG_LEN ,0) <= 0) 120 | { 121 | rtn = 0; 122 | } 123 | return rtn; 124 | } 125 | int Acc_Srv_sig(int sockfd ,char * JSON) 126 | { 127 | int sex; 128 | char name[30],password[30]; 129 | cJSON *root = JSON_Par(JSON); 130 | cJSON *item = JSON_Get_Obj_Item(root , "name"); 131 | strcpy(name,item -> valuestring); 132 | item = JSON_Get_Obj_Item(root ,"sex"); 133 | sex = item -> valueint; 134 | item = JSON_Get_Obj_Item(root , "password"); 135 | strcpy(password , item -> valuestring); 136 | JSON_shanchu(root); 137 | root = JSON_Cre_Obj(); 138 | item = JSON_Cre_Str("R"); 139 | JSON_Add_Item_To_Obj(root ,"type" ,item); 140 | if(Acct_Per_Is_user_Name(name)) 141 | { 142 | item = JSON_Cre_Bool(0); 143 | JSON_Add_Item_To_Obj(root , "res" , item); 144 | item = JSON_Cre_Str("用户名已存在!"); 145 | JSON_Add_Item_To_Obj(root , "reason" , item); 146 | char *out = JSON_prt(root); 147 | if(send(sockfd , (void *)out , MSG_LEN , 0) < 0){} 148 | JSON_shanchu(root); 149 | free(out); 150 | } 151 | else 152 | { 153 | if(Acc_Per_Add_User(name ,sex ,password)) 154 | { 155 | item = JSON_Cre_Bool(1); 156 | JSON_Add_Item_To_Obj(root , "res" , item); 157 | char *out = JSON_prt(root); 158 | if(send(sockfd , (void *)out , MSG_LEN , 0) < 0){} 159 | JSON_shanchu(root); 160 | free(out); 161 | return 1; 162 | } 163 | item = JSON_Cre_Bool(0); 164 | JSON_Add_Item_To_Obj(root , "res" , item); 165 | item = JSON_Cre_Str("服务器异常!"); 166 | JSON_Add_Item_To_Obj(root , "reason" , item); 167 | char *out = JSON_prt(root); 168 | if(send(sockfd , (void *)out , MSG_LEN , 0) < 0){} 169 | JSON_shanchu(root); 170 | free(out); 171 | } 172 | return 0; 173 | } 174 | int Acc_Srv_Log(int sockfd ,char *JSON) 175 | { 176 | int uid; 177 | char name[30] , password[30]; 178 | cJSON *root = JSON_Par(JSON); 179 | cJSON *item = JSON_Get_Obj_Item(root , "name"); 180 | strcpy(name,item -> valuestring); 181 | item = JSON_Get_Obj_Item(root , "password"); 182 | strcpy(password , item -> valuestring); 183 | JSON_shanchu(root); 184 | root = JSON_Cre_Obj(); 185 | item = JSON_Cre_Str("R"); 186 | JSON_Add_Item_To_Obj(root ,"type" ,item); 187 | if((uid = Acct_Per_Is_user_Name(name)) == 0) 188 | { 189 | item = JSON_Cre_Bool(0); 190 | JSON_Add_Item_To_Obj(root , "res" , item); 191 | item = JSON_Cre_Str("用户名不存在"); 192 | JSON_Add_Item_To_Obj(root , "reason" , item); 193 | char *out = JSON_prt(root); 194 | if(send(sockfd , (void *)out , MSG_LEN , 0) < 0){} 195 | JSON_shanchu(root); 196 | free(out); 197 | } 198 | else 199 | { 200 | if(Acc_Per_Mat_User_And_Password(uid ,password)) 201 | { 202 | Acc_Srv_Ch_Onl(uid ,1 ,sockfd); 203 | item = JSON_Cre_Bool(1); 204 | JSON_Add_Item_To_Obj(root , "res" , item); 205 | item = JSON_Cre_Num(uid); 206 | JSON_Add_Item_To_Obj(root , "uid" ,item); 207 | char *out = JSON_prt(root); 208 | if(send(sockfd , (void *)out , MSG_LEN , 0) < 0){} 209 | JSON_shanchu(root); 210 | free(out); 211 | return 1; 212 | } 213 | item = JSON_Cre_Bool(0); 214 | JSON_Add_Item_To_Obj(root , "res" , item); 215 | item = JSON_Cre_Str("用户名密码不匹配!"); 216 | JSON_Add_Item_To_Obj(root , "reason" , item); 217 | char *out = JSON_prt(root); 218 | if(send(sockfd , (void *)out , MSG_LEN , 0) < 0){} 219 | JSON_shanchu(root); 220 | free(out); 221 | } 222 | return 0; 223 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/ACC_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _ACCOUNT_SER_H 2 | #define _ACCOUNT_SER_H 3 | #include "./FRI_SRV.h" 4 | typedef struct online 5 | { 6 | int uid; 7 | int sockfd; 8 | struct online *next; 9 | } online_t; 10 | int Acc_Srv_Ch_Onl(int uid ,int is_online ,int sockfd); 11 | int ACC_SRV_SEND_ONL(int uid, int is_online); 12 | int Acc_Srv_Out(int sockfd , char *cJSON); 13 | int Acc_Srv_sig(int sockfd , char * cJSON); 14 | int Acc_Srv_Log(int sockfd ,char * cJSON); 15 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/CHAT_SRV.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include"./ACC_SRV.h" 5 | #include"./CONNECT.h" 6 | #include"./CHAT_SRV.h" 7 | #include"./GROUP_SRV.h" 8 | #include"../src/JSON.h" 9 | #include"../srvv/CHAT_PER.h" 10 | #include"../srvv/GRO_PER.h" 11 | #include"../srvv/ACC_PER.h" 12 | #include"../src/Common.h" 13 | #include"../src/List.h" 14 | #define MSG_LEN 1024 15 | extern online_t *Onl_List; 16 | void Chat_Srv_File(const char *JSON) 17 | { 18 | cJSON *root = JSON_Par(JSON); 19 | cJSON *item = JSON_Get_Obj_Item(root ,"fuid"); 20 | int fuid = item -> valueint; 21 | item = JSON_Get_Obj_Item(root ,"size"); 22 | item = JSON_Get_Obj_Item(root,"con"); 23 | int f_sock_fd = -1; 24 | online_t *o; 25 | List_For_Each(Onl_List ,o) 26 | { 27 | if(o -> uid == fuid) 28 | { 29 | f_sock_fd = o-> sockfd; 30 | break; 31 | } 32 | } 33 | if(f_sock_fd == -1) 34 | { 35 | return ; 36 | } 37 | if(send(f_sock_fd ,JSON ,MSG_LEN,0) <= 0) 38 | { 39 | perror("send"); 40 | JSON_shanchu(root); 41 | return ; 42 | } 43 | JSON_shanchu(root); 44 | return ; 45 | } 46 | int Chat_Srv_Get_Fri_Sock(int fuid) 47 | { 48 | online_t *cur_Pos; 49 | int to_sock = -1; 50 | List_For_Each(Onl_List ,cur_Pos) 51 | { 52 | if(cur_Pos -> uid == fuid) 53 | { 54 | to_sock = cur_Pos -> sockfd; 55 | } 56 | } 57 | return to_sock; 58 | } 59 | int Chat_Srv_Priva2(int sockfd ,const char *JSON) 60 | { 61 | int from_uid ,to_uid ,to_sock ; 62 | user_date_t Srvdate = DateNow(); 63 | user_time_t Srvtime = TimeNow(); 64 | char Srvdatetime[25]; 65 | sprintf(Srvdatetime ,"%04d-%02d-%02d %02d:%02d:%02d",Srvdate.year ,Srvdate.month ,Srvdate.day,Srvtime.hour ,Srvtime.minute ,Srvtime.second); 66 | cJSON *root = JSON_Par(JSON); 67 | cJSON *item = JSON_Get_Obj_Item(root ,"from_uid"); 68 | from_uid = item -> valueint; 69 | item = JSON_Get_Obj_Item(root ,"to_uid"); 70 | to_uid = item -> valueint; 71 | item = JSON_Cre_Str(Srvdatetime); 72 | JSON_Add_Item_To_Obj(root ,"time" ,item); 73 | char *out = JSON_prt(root); 74 | JSON_shanchu(root); 75 | to_sock = Chat_Srv_Get_Fri_Sock(to_uid); 76 | Chat_Per_Priva(from_uid ,to_uid ,out ,(to_sock == -1)); 77 | if(to_sock == -1) 78 | { 79 | return 2; 80 | } 81 | if(send(to_sock ,(void *)out ,MSG_LEN ,0) <= 0) 82 | { 83 | perror("send:"); 84 | free(out); 85 | return 0; 86 | } 87 | free(out); 88 | return 1; 89 | } 90 | int Chat_Srv_Group(int sockfd ,const char *JSON) 91 | { 92 | int from_uid ,to_gid ,to_sock ; 93 | char offlist[100] = "," ,str[4]; 94 | group_member_t *GroupMember ,*g; 95 | List_Init(GroupMember ,group_member_t); 96 | user_date_t Srvdate = DateNow(); 97 | user_time_t Srvtime = TimeNow(); 98 | char Srvdatetime[25]; 99 | sprintf(Srvdatetime ,"%04d-%02d-%02d %02d:%02d:%02d",Srvdate.year ,Srvdate.month ,Srvdate.day,Srvtime.hour ,Srvtime.minute ,Srvtime.second); 100 | cJSON *root = JSON_Par(JSON); 101 | cJSON *item = JSON_Get_Obj_Item(root ,"from_uid"); 102 | from_uid = item -> valueint; 103 | item = JSON_Get_Obj_Item(root ,"to_gid"); 104 | to_gid = item -> valueint; 105 | item = JSON_Cre_Str(Srvdatetime); 106 | JSON_Add_Item_To_Obj(root ,"time" ,item); 107 | item = JSON_Cre_Str(Acc_Per_Get_User_Name_From_Uid(from_uid)); 108 | JSON_Add_Item_To_Obj(root ,"uname", item); 109 | char *out = JSON_prt(root); 110 | JSON_shanchu(root); 111 | Gro_Per_Get_Gro_Mem(GroupMember ,to_gid); 112 | List_For_Each(GroupMember ,g) 113 | { 114 | if(g -> user_info.uid == from_uid) 115 | { 116 | continue; 117 | } 118 | to_sock = Chat_Srv_Get_Fri_Sock(g -> user_info.uid); 119 | if(to_sock == -1) 120 | { 121 | sprintf(str ,"%d,",g->user_info.uid); 122 | strcat(offlist ,str); 123 | continue; 124 | } 125 | if(send(to_sock ,(void *)out ,MSG_LEN ,0) <= 0) 126 | { 127 | perror("send:"); 128 | free(out); 129 | return 0; 130 | } 131 | } 132 | Chat_Per_Gro(from_uid ,to_gid ,out ,offlist); 133 | free(out); 134 | return 1; 135 | } 136 | void Chat_Srv_Send_Off_Priva_Msg(int uid) 137 | { 138 | MYSQL_RES *res = Chat_Per_Get_Offline_Priva_Msg(uid); 139 | if(res == NULL) 140 | { 141 | return; 142 | } 143 | MYSQL_ROW row; 144 | int to_sock = Chat_Srv_Get_Fri_Sock(uid); 145 | while((row = mysql_fetch_row(res))) 146 | { 147 | if(send(to_sock ,row[0] ,MSG_LEN ,0) <= 0) 148 | { 149 | perror("send:"); 150 | continue; 151 | } 152 | } 153 | mysql_free_result(res); 154 | } 155 | void Chat_Srv_Send_Priva_Res(int sockfd ,const char *JSON) 156 | { 157 | MYSQL_RES *res = NULL; 158 | MYSQL_ROW row; 159 | cJSON *root = JSON_Par(JSON); 160 | cJSON *item = JSON_Get_Obj_Item(root ,"uid"); 161 | int uid = item -> valueint; 162 | item = JSON_Get_Obj_Item(root ,"fuid"); 163 | int fuid = item -> valueint; 164 | JSON_shanchu(root); 165 | res = Chat_Per_Get_Priva_Rec(uid ,fuid); 166 | while((row = mysql_fetch_row(res))) 167 | { 168 | root = JSON_Par(row[0]); 169 | item = JSON_Get_Obj_Item(root ,"type"); 170 | strcpy(item -> valuestring,"E"); 171 | char *out = JSON_prt(root); 172 | JSON_shanchu(root); 173 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) <= 0) 174 | { 175 | perror("send:"); 176 | free(out); 177 | continue; 178 | } 179 | free(out); 180 | } 181 | mysql_free_result(res); 182 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/CHAT_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _CHAT_SRV_H 2 | #define _CHAT_SRV_H 3 | void Chat_Srv_File(const char *cJSON); 4 | int Chat_Srv_Get_Fri_Sock(int fuid); 5 | int Chat_Srv_Group(int sockfd ,const char *cJSON); 6 | int Chat_Srv_Priva2(int sockfd ,const char *cJSON); 7 | void Chat_Srv_Send_Priva_Res(int sockfd ,const char *cJSON); 8 | void Chat_Srv_Send_Off_Priva_Msg(int uid); 9 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/CONNECT.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "../src/JSON.h" 7 | #include "./ACC_SRV.h" 8 | #include "./FRI_SRV.h" 9 | #include "./CONNECT.h" 10 | #include "./CHAT_SRV.h" 11 | #include "./GROUP_SRV.h" 12 | #include "../srvv/FRI_PER.h" 13 | #include "../src/List.h" 14 | #define LISTEN_NUM 12 15 | #define MSG_LEN 1024 16 | online_t *Onl_List; 17 | void * thread(void *arg) 18 | { 19 | int ret ,recv_len; 20 | char buf[MSG_LEN]; 21 | cJSON *root ,*item; 22 | char choice[3]; 23 | int client_fd = (int)(long)arg; 24 | while(1) 25 | { 26 | recv_len = 0; 27 | while(recv_len < MSG_LEN) 28 | { 29 | ret = 0; 30 | if((ret = recv(client_fd , buf + recv_len , MSG_LEN - recv_len , 0)) <= 0) 31 | { 32 | int uid = Acc_Srv_Ch_Onl(-1 , 0 ,client_fd); 33 | if(uid != -1) 34 | { 35 | ACC_SRV_SEND_ONL(uid ,0); 36 | } 37 | perror("recv"); 38 | return NULL; 39 | } 40 | recv_len += ret; 41 | } 42 | root = JSON_Par(buf); 43 | item = JSON_Get_Obj_Item(root,"type"); 44 | strcpy(choice ,item -> valuestring); 45 | JSON_shanchu(root); 46 | switch(choice[0]) 47 | { 48 | case 'L' : 49 | Acc_Srv_Log(client_fd , buf); 50 | break; 51 | case 'S' : 52 | Acc_Srv_sig(client_fd , buf); 53 | break; 54 | case 'A' : 55 | Fri_Srv_Add(client_fd, buf); 56 | break; 57 | case 'G' : 58 | Fri_Srv_Get_List(client_fd ,buf); 59 | break; 60 | case 'g' : 61 | Gro_Srv_Get_List(client_fd ,buf); 62 | break; 63 | case 'P' : 64 | Chat_Srv_Priva2(client_fd,buf); 65 | break; 66 | case 'p': 67 | Chat_Srv_Group(client_fd ,buf); 68 | break; 69 | case 'F' : 70 | Chat_Srv_File(buf); 71 | break; 72 | case 'O' : 73 | Acc_Srv_Out(client_fd ,buf); 74 | break; 75 | case 'a': 76 | Fri_Srv_App(client_fd ,buf); 77 | break; 78 | case 'c': 79 | Gro_Srv_Cre(client_fd ,buf); 80 | break; 81 | case 'M' : 82 | Gro_Srv_Add_Mem(client_fd ,buf); 83 | break; 84 | case 'm': 85 | Gro_Srv_Show_Mem(client_fd ,buf); 86 | break; 87 | case 'Q' : 88 | Gro_Srv_Quit(client_fd ,buf); 89 | break; 90 | case 'E' : 91 | Chat_Srv_Send_Priva_Res(client_fd ,buf); 92 | break; 93 | } 94 | } 95 | return NULL; 96 | } 97 | void Connect(int port) 98 | { 99 | int sockfd; 100 | int client_fd; 101 | int optval; 102 | int len; 103 | List_Init(Onl_List , online_t); 104 | struct sockaddr_in serv_addr , client_addr; 105 | len = sizeof(struct sockaddr_in); 106 | memset(&serv_addr , 0 ,len); 107 | memset(&client_addr , 0 , len); 108 | serv_addr.sin_family = AF_INET; 109 | serv_addr.sin_port = htons(port); 110 | serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 111 | sockfd = socket(AF_INET , SOCK_STREAM , 0); 112 | if(sockfd < 0) 113 | { 114 | perror("socket"); 115 | exit(0); 116 | } 117 | optval = 1; 118 | if(setsockopt(sockfd , SOL_SOCKET , SO_REUSEADDR , (void *)&optval , sizeof(int)) < 0) 119 | { 120 | perror("socksetopt"); 121 | exit(0); 122 | } 123 | if(bind(sockfd , (struct sockaddr *)&serv_addr , len) < 0) 124 | { 125 | perror("bind"); 126 | exit(0); 127 | } 128 | if(listen(sockfd , LISTEN_NUM) < 0) 129 | { 130 | perror("listen"); 131 | exit(0); 132 | } 133 | while(1) 134 | { 135 | client_fd = accept(sockfd , (struct sockaddr *)&client_addr , (socklen_t *)&len); 136 | if(client_fd < 0) 137 | { 138 | perror("accept"); 139 | exit(0); 140 | } 141 | pthread_t thid; 142 | pthread_create(&thid , NULL , thread ,(void *)(long)client_fd); 143 | } 144 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/CONNECT.h: -------------------------------------------------------------------------------- 1 | #ifndef _CONNECT_H 2 | #define _CONNECT_H 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | typedef struct 9 | { 10 | char type; 11 | char msg[1023]; 12 | } msg_t; 13 | void Connect(int port); 14 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/FRI_SRV.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "ACC_SRV.h" 6 | #include "FRI_SRV.h" 7 | #include "CHAT_SRV.h" 8 | #include "../srvv/ACC_PER.h" 9 | #include "../srvv/FRI_PER.h" 10 | #include "../src/List.h" 11 | #include "../src/JSON.h" 12 | #define MSG_LEN 1024 13 | extern online_t* Onl_List; 14 | int Fri_Srv_Get_List(int sockfd ,const char *JSON) 15 | { 16 | int uid; 17 | char buf[MSG_LEN]; 18 | cJSON *root = JSON_Par(JSON); 19 | cJSON *item = JSON_Get_Obj_Item(root ,"uid"); 20 | uid = item -> valueint; 21 | JSON_shanchu(root); 22 | friends_t *fri_list = NULL; 23 | List_Init(fri_list ,friends_t); 24 | Fri_Per_Get_List(fri_list ,uid); 25 | friends_t *cur_Pos; 26 | List_For_Each(fri_list ,cur_Pos) 27 | { 28 | root = JSON_Cre_Obj(); 29 | item = JSON_Cre_Str("L"); 30 | JSON_Add_Item_To_Obj(root ,"type" ,item); 31 | item = JSON_Cre_Num(cur_Pos -> uid); 32 | JSON_Add_Item_To_Obj(root ,"uid" ,item); 33 | item = JSON_Cre_Str(cur_Pos -> name); 34 | JSON_Add_Item_To_Obj(root ,"name" ,item); 35 | item = JSON_Cre_Bool(cur_Pos -> sex); 36 | JSON_Add_Item_To_Obj(root ,"sex" ,item); 37 | item = JSON_Cre_Bool(cur_Pos -> is_vip); 38 | JSON_Add_Item_To_Obj(root ,"is_vip" ,item); 39 | item = JSON_Cre_Bool(cur_Pos -> is_follow); 40 | JSON_Add_Item_To_Obj(root ,"is_follow" ,item); 41 | item = JSON_Cre_Bool(cur_Pos -> is_online); 42 | JSON_Add_Item_To_Obj(root ,"is_online" ,item); 43 | item = JSON_Cre_Bool(cur_Pos -> state); 44 | JSON_Add_Item_To_Obj(root ,"state" ,item); 45 | char *out = JSON_prt(root); 46 | JSON_shanchu(root); 47 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) < 0) 48 | { 49 | perror("发送: 客户端响应失败"); 50 | free(out); 51 | return 0; 52 | } 53 | free(out); 54 | } 55 | root = JSON_Cre_Obj(); 56 | item = JSON_Cre_Str("L"); 57 | JSON_Add_Item_To_Obj(root ,"type" ,item); 58 | item = JSON_Cre_Num(0); 59 | JSON_Add_Item_To_Obj(root ,"uid" ,item); 60 | char *out = JSON_prt(root); 61 | JSON_shanchu(root); 62 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) < 0) 63 | { 64 | perror("发送:客户端响应失败"); 65 | free(out); 66 | return 0; 67 | } 68 | free(out); 69 | ACC_SRV_SEND_ONL(uid ,1); 70 | List_Destroy(fri_list ,friends_t); 71 | root = JSON_Cre_Obj(); 72 | item = JSON_Cre_Str("R"); 73 | JSON_Add_Item_To_Obj(root ,"type" ,item); 74 | item = JSON_Cre_Bool(1); 75 | JSON_Add_Item_To_Obj(root ,"res" ,item); 76 | out = JSON_prt(root); 77 | JSON_shanchu(root); 78 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) < 0) 79 | { 80 | perror("接收: 客户端响应失败"); 81 | free(out); 82 | return 0; 83 | } 84 | free(out); 85 | Chat_Srv_Send_Off_Priva_Msg(uid); 86 | return 1; 87 | } 88 | int Fri_Srv_Add(int sockfd ,const char *JSON) 89 | { 90 | cJSON* root = JSON_Par(JSON); 91 | cJSON* item = JSON_Get_Obj_Item(root ,"uid"); 92 | int uid = item -> valueint; 93 | item = JSON_Get_Obj_Item(root ,"fname"); 94 | int fuid = Acct_Per_Is_user_Name(item -> valuestring); 95 | JSON_shanchu(root); 96 | root = JSON_Cre_Obj(); 97 | item = JSON_Cre_Str("R"); 98 | JSON_Add_Item_To_Obj(root ,"type" ,item); 99 | item = JSON_Cre_Bool((fuid != 0)); 100 | JSON_Add_Item_To_Obj(root ,"res",item); 101 | if(fuid == 0) 102 | { 103 | item = JSON_Cre_Str("用户名不存在!"); 104 | JSON_Add_Item_To_Obj(root ,"reason",item); 105 | } 106 | char *out = JSON_prt(root); 107 | if(send(sockfd ,(void *)out ,MSG_LEN ,0) <= 0) 108 | { 109 | perror("send"); 110 | return 0; 111 | } 112 | free(out); 113 | Fri_Per_Add(uid ,fuid); 114 | if(Chat_Srv_Get_Fri_Sock(fuid) == 0) 115 | { 116 | return 1; 117 | } 118 | Fri_Srv_Send_Add(uid ,fuid,"A"); 119 | return 1; 120 | } 121 | 122 | int Fri_Srv_Send_Add(int uid ,int fuid ,char* type) 123 | { 124 | int f_sock_fd = -1; 125 | friends_t * NewFriends = (friends_t *)malloc(sizeof(friends_t)); 126 | if(*type == 'A') 127 | { 128 | NewFriends->uid = uid; 129 | Fri_Per_Get_Fri_Info(NewFriends); 130 | f_sock_fd = Chat_Srv_Get_Fri_Sock(fuid); 131 | } 132 | else 133 | { 134 | NewFriends->uid = fuid; 135 | Fri_Per_Get_Fri_Info(NewFriends); 136 | f_sock_fd = Chat_Srv_Get_Fri_Sock(uid); 137 | NewFriends -> state = 1; 138 | } 139 | cJSON *root = JSON_Cre_Obj(); 140 | cJSON *item = JSON_Cre_Str(type); 141 | JSON_Add_Item_To_Obj(root ,"type" ,item); 142 | item = JSON_Cre_Num(NewFriends -> uid); 143 | JSON_Add_Item_To_Obj(root ,"uid" ,item); 144 | item = JSON_Cre_Str(NewFriends -> name); 145 | JSON_Add_Item_To_Obj(root ,"name" ,item); 146 | item = JSON_Cre_Bool(NewFriends -> sex); 147 | JSON_Add_Item_To_Obj(root ,"sex" ,item); 148 | item = JSON_Cre_Bool(NewFriends -> is_vip); 149 | JSON_Add_Item_To_Obj(root ,"is_vip" ,item); 150 | item = JSON_Cre_Bool(NewFriends -> is_follow); 151 | JSON_Add_Item_To_Obj(root ,"is_follow" ,item); 152 | item = JSON_Cre_Bool(NewFriends -> is_online); 153 | JSON_Add_Item_To_Obj(root ,"is_online" ,item); 154 | item = JSON_Cre_Bool(NewFriends -> state); 155 | JSON_Add_Item_To_Obj(root ,"state" ,item); 156 | free(NewFriends); 157 | char *out = JSON_prt(root); 158 | JSON_shanchu(root); 159 | if(send(f_sock_fd ,(void *)out ,MSG_LEN,0) < 0) 160 | { 161 | perror("send"); 162 | printf("发给sock_fd = %d 失败\n",f_sock_fd); 163 | free(out); 164 | return 0; 165 | } 166 | free(out); 167 | return 1; 168 | } 169 | 170 | int Fri_Srv_App(int sockfd ,const char *JSON) 171 | { 172 | cJSON *root = JSON_Par(JSON); 173 | cJSON *item = JSON_Get_Obj_Item(root ,"uid"); 174 | int uid = item -> valueint; 175 | item = JSON_Get_Obj_Item(root ,"fuid"); 176 | int fuid = item -> valueint; 177 | item = JSON_Get_Obj_Item(root ,"is_agree"); 178 | int is_agree = item -> valueint; 179 | int f_sock_fd = Chat_Srv_Get_Fri_Sock(uid); 180 | Fri_Per_App(uid ,fuid ,is_agree); 181 | if(is_agree) 182 | { 183 | Fri_Srv_Send_Add(uid ,fuid ,"a"); 184 | } 185 | else 186 | { 187 | friends_t *NewFriends = (friends_t *)malloc(sizeof(friends_t)); 188 | NewFriends -> uid = fuid; 189 | Fri_Per_Get_Fri_Info(NewFriends); 190 | item = JSON_Cre_Str(NewFriends -> name); 191 | JSON_Add_Item_To_Obj(root ,"fname",item); 192 | char *out = JSON_prt(root); 193 | JSON_shanchu(root); 194 | free(NewFriends); 195 | if(send(f_sock_fd ,(void*)out ,MSG_LEN ,0) <= 0) 196 | { 197 | perror("send"); 198 | return 0; 199 | } 200 | free(out); 201 | } 202 | return 1; 203 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/FRI_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _FRIENDS_SRV_H 2 | #define _FRIENDS_SRV_H 3 | #include "./CONNECT.h" 4 | typedef struct friends 5 | { 6 | int uid; 7 | char name[30]; 8 | int sex; 9 | int is_vip; 10 | int is_online; 11 | int is_follow; 12 | int state; 13 | struct friends *next; 14 | } friends_t; 15 | int Fri_Srv_Get_List(int sockfd ,const char *cJSON); 16 | int Fri_Srv_Add(int sockfd ,const char *cJSON); 17 | int Fri_Srv_Send_Add(int uid,int fuid ,char* type); 18 | int Friends_Srv_Del(int sockfd ,const char *cJSON); 19 | int Fri_Srv_App(int sockfd ,const char *cJSON); 20 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/GROUP_SRV.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "./GROUP_SRV.h" 6 | #include "../src/List.h" 7 | #include "./CHAT_SRV.h" 8 | #include "../src/JSON.h" 9 | #include "../srvv/GRO_PER.h" 10 | #define MSG_LEN 1024 11 | int Gro_Srv_Add_Mem(int client_fd ,char *JSON) 12 | { 13 | int gid ,uid; 14 | cJSON *root = JSON_Par(JSON); 15 | cJSON *item = JSON_Get_Obj_Item(root ,"gid"); 16 | gid = item -> valueint; 17 | item = JSON_Get_Obj_Item(root ,"uid"); 18 | uid = item -> valueint; 19 | JSON_shanchu(root); 20 | root = JSON_Cre_Obj(); 21 | item = JSON_Cre_Str("R"); 22 | JSON_Add_Item_To_Obj(root ,"type" ,item); 23 | if(Gro_Per_Add_Mem(gid ,uid)) 24 | { 25 | item = JSON_Cre_Bool(1); 26 | Gro_Srv_Send_Info(gid ,uid); 27 | } 28 | else 29 | { 30 | item = JSON_Cre_Bool(0); 31 | } 32 | JSON_Add_Item_To_Obj(root ,"res",item); 33 | char *out = JSON_prt(root); 34 | JSON_shanchu(root); 35 | if(send(client_fd ,out ,MSG_LEN,0) <= 0) 36 | { 37 | perror("send"); 38 | free(out); 39 | return 0; 40 | } 41 | return 1; 42 | } 43 | void Gro_Srv_Send_Info(int gid ,int uid) 44 | { 45 | cJSON *root = JSON_Cre_Obj(); 46 | cJSON *item = JSON_Cre_Str("J"); 47 | JSON_Add_Item_To_Obj(root ,"type" ,item); 48 | group_t *Group_Info = Gro_Per_Get_Info(gid); 49 | item = JSON_Cre_Num(Group_Info -> gid); 50 | JSON_Add_Item_To_Obj(root ,"gid" ,item); 51 | item = JSON_Cre_Str(Group_Info -> name); 52 | JSON_Add_Item_To_Obj(root ,"name" ,item); 53 | item = JSON_Cre_Num(Group_Info -> owner); 54 | JSON_Add_Item_To_Obj(root ,"owner" ,item); 55 | item = JSON_Cre_Num(Group_Info -> num); 56 | JSON_Add_Item_To_Obj(root ,"num" , item); 57 | char *out = JSON_prt(root); 58 | JSON_shanchu(root); 59 | int f_fd = Chat_Srv_Get_Fri_Sock(uid); 60 | if(send(f_fd ,out ,MSG_LEN,0) <= 0) 61 | { 62 | perror("send"); 63 | free(out); 64 | return ; 65 | } 66 | free(out); 67 | } 68 | int Gro_Srv_Cre(int client_fd ,char *buf) 69 | { 70 | char gname[30]; 71 | int uid; 72 | cJSON *root = JSON_Par(buf); 73 | cJSON *item = JSON_Get_Obj_Item(root ,"gname"); 74 | strcpy(gname ,item -> valuestring); 75 | item = JSON_Get_Obj_Item(root ,"uid"); 76 | uid = item -> valueint; 77 | JSON_shanchu(root); 78 | root = JSON_Cre_Obj(); 79 | item = JSON_Cre_Str("R"); 80 | JSON_Add_Item_To_Obj(root ,"type" ,item); 81 | if(Gro_Per_Is_Gro(gname)) 82 | { 83 | item = JSON_Cre_Bool(0); 84 | JSON_Add_Item_To_Obj(root ,"res",item); 85 | item = JSON_Cre_Str("群已存在"); 86 | JSON_Add_Item_To_Obj(root ,"reason" ,item); 87 | char *out = JSON_prt(root); 88 | if(send(client_fd ,out ,MSG_LEN ,0) <= 0) 89 | { 90 | perror("send"); 91 | free(out); 92 | return 0; 93 | } 94 | free(out); 95 | return 0; 96 | } 97 | Gro_Srv_Send_Info(Gro_Per_Cre(uid ,gname) ,uid); 98 | item = JSON_Cre_Bool(1); 99 | JSON_Add_Item_To_Obj(root , "res",item); 100 | char *out = JSON_prt(root); 101 | if(send(client_fd ,out ,MSG_LEN ,0) <= 0) 102 | { 103 | perror("send"); 104 | free(out); 105 | return 0; 106 | } 107 | free(out); 108 | return 1; 109 | } 110 | int Gro_Srv_Get_List(int client_fd ,char *JSON) 111 | { 112 | int uid; 113 | cJSON *root = JSON_Par(JSON); 114 | cJSON *item = JSON_Get_Obj_Item(root ,"uid"); 115 | uid = item -> valueint; 116 | JSON_shanchu(root); 117 | group_t *group_list = NULL; 118 | List_Init(group_list ,group_t); 119 | Gro_Per_Get_Gro_a(group_list ,uid); 120 | group_t *cur_Pos; 121 | List_For_Each(group_list ,cur_Pos) 122 | { 123 | root = JSON_Cre_Obj(); 124 | item = JSON_Cre_Str("l"); 125 | JSON_Add_Item_To_Obj(root ,"type" ,item); 126 | item = JSON_Cre_Num(cur_Pos -> gid); 127 | JSON_Add_Item_To_Obj(root ,"gid" ,item); 128 | item = JSON_Cre_Str(cur_Pos -> name); 129 | JSON_Add_Item_To_Obj(root ,"name" ,item); 130 | item = JSON_Cre_Num(cur_Pos -> owner); 131 | JSON_Add_Item_To_Obj(root ,"owner" ,item); 132 | item = JSON_Cre_Num(cur_Pos -> num); 133 | JSON_Add_Item_To_Obj(root ,"num",item); 134 | char *out = JSON_prt(root); 135 | JSON_shanchu(root); 136 | if(send(client_fd ,(void *)out ,MSG_LEN ,0) < 0) 137 | { 138 | perror("发送: 客户端响应失败"); 139 | free(out); 140 | return 0; 141 | } 142 | free(out); 143 | } 144 | root = JSON_Cre_Obj(); 145 | item = JSON_Cre_Str("l"); 146 | JSON_Add_Item_To_Obj(root ,"type" ,item); 147 | item = JSON_Cre_Num(0); 148 | JSON_Add_Item_To_Obj(root ,"gid" ,item); 149 | char *out = JSON_prt(root); 150 | JSON_shanchu(root); 151 | if(send(client_fd ,(void *)out ,MSG_LEN ,0) < 0) 152 | { 153 | perror("发送: 客户端响应失败"); 154 | free(out); 155 | return 0; 156 | } 157 | free(out); 158 | List_Destroy(group_list ,group_t); 159 | root = JSON_Cre_Obj(); 160 | item = JSON_Cre_Str("R"); 161 | JSON_Add_Item_To_Obj(root ,"type" ,item); 162 | item = JSON_Cre_Bool(1); 163 | JSON_Add_Item_To_Obj(root ,"res" ,item); 164 | out = JSON_prt(root); 165 | JSON_shanchu(root); 166 | if(send(client_fd ,(void *)out ,MSG_LEN ,0) < 0) 167 | { 168 | perror("接收: 客户端响应失败"); 169 | free(out); 170 | return 0; 171 | } 172 | free(out); 173 | return 1; 174 | } 175 | void Gro_Srv_Show_Mem(int client_fd ,const char *JSON) 176 | { 177 | cJSON *root = JSON_Par(JSON); 178 | cJSON *item = JSON_Get_Obj_Item(root ,"gid"); 179 | int gid = item -> valueint; 180 | JSON_shanchu(root); 181 | group_member_t *GroupMember; 182 | List_Init(GroupMember ,group_member_t); 183 | Gro_Per_Get_Gro_Mem(GroupMember ,gid); 184 | group_member_t *m; 185 | List_For_Each(GroupMember ,m) 186 | { 187 | root = JSON_Cre_Obj(); 188 | cJSON_AddStringToObject(root ,"type" ,"m"); 189 | cJSON_AddNumberToObject(root ,"gid",m -> gid); 190 | cJSON_AddNumberToObject(root ,"uid",m -> user_info.uid); 191 | cJSON_AddStringToObject(root ,"name" ,m -> user_info.name); 192 | cJSON_AddNumberToObject(root ,"sex" ,m -> user_info.sex); 193 | cJSON_AddNumberToObject(root ,"is_vip" , m-> user_info.is_vip); 194 | cJSON_AddNumberToObject(root ,"is_online" ,m -> user_info.is_online); 195 | cJSON_AddNumberToObject(root ,"permission" ,m -> permission); 196 | char *out = JSON_prt(root); 197 | JSON_shanchu(root); 198 | if(send(client_fd ,(void *)out ,MSG_LEN ,0) < 0) 199 | { 200 | perror("接收: 客户端响应失败"); 201 | free(out); 202 | continue; 203 | } 204 | free(out); 205 | } 206 | } 207 | 208 | void Gro_Srv_Quit(int client_fd ,const char *JSON) 209 | { 210 | cJSON *root = JSON_Par(JSON); 211 | cJSON *item = JSON_Get_Obj_Item(root ,"do"); 212 | char *_do = item -> valuestring; 213 | item = JSON_Get_Obj_Item(root ,"gid"); 214 | int gid = item -> valueint; 215 | int f_fd = 0; 216 | if(strcmp(_do ,"解散") == 0) 217 | { 218 | group_member_t *GroupMember; 219 | List_Init(GroupMember ,group_member_t); 220 | Gro_Per_Get_Gro_Mem(GroupMember ,gid); 221 | group_member_t *m; 222 | root = JSON_Cre_Obj(); 223 | cJSON_AddStringToObject(root ,"type" ,"D"); 224 | cJSON_AddNumberToObject(root ,"gid" ,gid); 225 | char *out = JSON_prt(root); 226 | JSON_shanchu(root); 227 | List_For_Each(GroupMember ,m) 228 | { 229 | if(m -> permission == 2) 230 | { 231 | continue; 232 | } 233 | if((f_fd = Chat_Srv_Get_Fri_Sock(m -> user_info.uid)) > 0) 234 | { 235 | if(send(f_fd ,out ,MSG_LEN,0) <= 0) 236 | { 237 | perror("send"); 238 | free(out); 239 | } 240 | } 241 | } 242 | Gro_Per_Del(gid); 243 | } 244 | else 245 | { 246 | item = JSON_Get_Obj_Item(root ,"uid"); 247 | Gro_Per_Del_Mem(gid ,item ->valueint); 248 | } 249 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/service/GROUP_SRV.h: -------------------------------------------------------------------------------- 1 | #ifndef _GROUP_SRV_H 2 | #define _GROUP_SRV_H 3 | #include"./FRI_SRV.h" 4 | typedef struct group_t 5 | { 6 | int gid; 7 | char name[50]; 8 | int owner; 9 | int num; 10 | struct group_t *next; 11 | }group_t; 12 | typedef struct group_member 13 | { 14 | int gid; 15 | friends_t user_info; 16 | int permission; 17 | struct group_member *next; 18 | }group_member_t; 19 | int Gro_Srv_Add_Mem(int client_fd ,char *cJSON); 20 | int Gro_Srv_Cre(int client_fd ,char *buf); 21 | int Gro_Srv_Get_List(int client_fd ,char *cJSON); 22 | void Gro_Srv_Send_Info(int gid ,int uid); 23 | void Gro_Srv_Show_Mem(int client_fd ,const char *cJSON); 24 | void Gro_Srv_Quit(int client_fd ,const char *cJSON); 25 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/src/Common.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include"./Common.h" 5 | void cc_Clear() 6 | { 7 | char ch; 8 | while((ch=getchar())!='\n' && ch!=EOF){} 9 | } 10 | char *sgets(char *str,int len) 11 | { 12 | fgets(str,len,stdin); 13 | if(str[strlen(str)-1]=='\n') 14 | { 15 | str[strlen(str)-1]='\0'; 16 | } 17 | return str; 18 | } 19 | int DateCmp(user_date_t dt1, user_date_t dt2) 20 | { 21 | if (dt1.year < dt2.year) 22 | { 23 | return -1; 24 | } 25 | else if (dt1.month < dt2.month && dt1.year == dt2.year) 26 | { 27 | return -1; 28 | } 29 | else if (dt1.month == dt2.month && dt1.day < dt2.day && dt1.year == dt2.year) 30 | { 31 | return -1; 32 | } 33 | else if (dt1.day == dt2.day && dt1.year == dt2.year && dt1.month == dt2.month) 34 | { 35 | return 0; 36 | } 37 | else 38 | { 39 | return 1; 40 | } 41 | } 42 | user_date_t DateNow() 43 | { 44 | user_date_t curDate; 45 | time_t now; 46 | struct tm *timeNow; 47 | time(&now); 48 | timeNow = localtime(&now); 49 | curDate.year=timeNow->tm_year+1900; 50 | curDate.month=timeNow->tm_mon+1; 51 | curDate.day=timeNow->tm_mday; 52 | return curDate; 53 | } 54 | user_time_t TimeNow() 55 | { 56 | user_time_t curTime; 57 | time_t now; 58 | struct tm *timeNow; 59 | time(&now); 60 | timeNow = localtime(&now); 61 | curTime.hour=timeNow->tm_hour; 62 | curTime.minute=timeNow->tm_min; 63 | curTime.second=timeNow->tm_sec; 64 | return curTime; 65 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/src/Common.h: -------------------------------------------------------------------------------- 1 | #ifndef _COMMON_H 2 | #define _COMMON_H 3 | #include 4 | #include 5 | typedef struct 6 | { 7 | int year; 8 | int month; 9 | int day; 10 | }user_date_t; 11 | typedef struct 12 | { 13 | int hour; 14 | int minute; 15 | int second; 16 | }user_time_t; 17 | char *sgets(char *str,int len); 18 | void cc_Clear(); 19 | int DateCmp(user_date_t dt1, user_date_t dt2); 20 | user_date_t DateNow(); 21 | user_time_t TimeNow(); 22 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/src/JSON.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "JSON.h" 9 | static const char *ep; 10 | const char *JSON_cuowuzhizhen(void) {return ep;} 11 | static int JSON_bijiao_str(const char *p1,const char *p2) 12 | { 13 | if (!p1) 14 | { 15 | return (p1==p2)?0:1; 16 | } 17 | if (!p2) 18 | { 19 | return 1; 20 | } 21 | for(; tolower(*p1) == tolower(*p2); ++p1, ++p2) 22 | { 23 | if(*p1 == 0) 24 | { 25 | return 0; 26 | } 27 | } 28 | return tolower(*(const unsigned char *)p1) - tolower(*(const unsigned char *)p2); 29 | } 30 | static void (*cJSON_free)(void *ptr) = free; 31 | static void *(*cJSON_malloc)(size_t sz) = malloc; 32 | void JSON_csh_gouzi(JSON_gouzi * hooks)//// 33 | { 34 | if (!hooks) 35 | { 36 | cJSON_free = free; 37 | cJSON_malloc = malloc; 38 | return; 39 | } 40 | cJSON_free = (hooks->free_fn)?hooks->free_fn:free; 41 | cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; 42 | } 43 | static char* JSON_chuanlian(const char* str)//// 44 | { 45 | char* copy; 46 | size_t len; 47 | len = strlen(str) + 1; 48 | if (!(copy = (char*)cJSON_malloc(len))) 49 | { 50 | return 0; 51 | } 52 | memcpy(copy,str,len); 53 | return copy; 54 | } 55 | static cJSON *JSON_xwp(void) 56 | { 57 | cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); 58 | if (node) 59 | { 60 | memset(node,0,sizeof(cJSON)); 61 | } 62 | return node; 63 | } 64 | void JSON_shanchu(cJSON *c) 65 | { 66 | cJSON *next; 67 | while(c) 68 | { 69 | next=c->next; 70 | if (c->child&&!(c->type&cJSON_IsReference)) 71 | { 72 | JSON_shanchu(c->child); 73 | } 74 | if (c->valuestring&&!(c->type&cJSON_IsReference)) 75 | { 76 | cJSON_free(c->valuestring); 77 | } 78 | if (c->string&&!(c->type&cJSON_StringIsConst)) 79 | { 80 | cJSON_free(c->string); 81 | } 82 | cJSON_free(c); 83 | c=next; 84 | } 85 | } 86 | static const char *par_num(cJSON *item,const char *num) 87 | { 88 | int sub=0,signsub=1; 89 | double n=0,sca=0,sig=1; 90 | if (*num=='-') 91 | { 92 | sig=-1,num++; 93 | } 94 | if (*num=='0') 95 | { 96 | num++; 97 | } 98 | if (*num<='9'&&*num>='1') 99 | { 100 | do n=(n*10.0)+(*num++ -'0'); 101 | while (*num<='9'&&*num>='0'); 102 | } 103 | if (*num=='.' && num[1]>='0' && num[1]<='9') 104 | { 105 | num++; 106 | do n=(n*10.0)+(*num++ -'0'),sca--; 107 | while (*num<='9'&&*num>='0'); 108 | } 109 | if (*num=='E'||*num=='e') 110 | { 111 | num++; 112 | if (*num=='+') 113 | { 114 | num++; 115 | } 116 | else if (*num=='-') 117 | { 118 | signsub=-1,num++; 119 | } 120 | while (*num<='9'&&*num>='0') sub=(sub*10)+(*num++ - '0'); 121 | } 122 | n=sig*n*pow(10.0,(sca+sub*signsub)); 123 | item->valuedouble=n; 124 | item->valueint=(int)n; 125 | item->type=JSON_NUM; 126 | return num; 127 | } 128 | static int po2 (int x) 129 | { 130 | --x; 131 | x|=x>>1; 132 | x|=x>>2; 133 | x|=x>>4; 134 | x|=x>>8; 135 | x|=x>>16; 136 | return x+1; 137 | } 138 | typedef struct {char *buffer; int length; int offset; } printbuffer; 139 | static char* queren(printbuffer *p,int nedd) 140 | { 141 | int new_siz; 142 | char *new_buf; 143 | if (!p || !p->buffer) 144 | { 145 | return 0; 146 | } 147 | nedd+=p->offset; 148 | if (nedd<=p->length) 149 | { 150 | return p->buffer+p->offset; 151 | } 152 | new_siz=po2(nedd); 153 | new_buf=(char*)cJSON_malloc(new_siz); 154 | if (!new_buf) 155 | { 156 | cJSON_free(p->buffer); 157 | p->length=0,p->buffer=0; 158 | return 0; 159 | } 160 | if (new_buf) 161 | { 162 | memcpy(new_buf,p->buffer,p->length); 163 | } 164 | cJSON_free(p->buffer); 165 | p->buffer=new_buf; 166 | p->length=new_siz; 167 | return new_buf+p->offset; 168 | } 169 | static int gengxin(printbuffer *p) 170 | { 171 | char *str; 172 | if (!p || !p->buffer) 173 | { 174 | return 0; 175 | } 176 | str=p->buffer+p->offset; 177 | return p->offset+strlen(str); 178 | } 179 | static char *print_number(cJSON *item,printbuffer *p) 180 | { 181 | double d=item->valuedouble; 182 | char *str=0; 183 | if (d==0) 184 | { 185 | if (p) 186 | { 187 | str=queren(p,2); 188 | } 189 | else 190 | { 191 | str=(char*)cJSON_malloc(2); 192 | } 193 | if (str) 194 | { 195 | strcpy(str,"0"); 196 | } 197 | } 198 | else if (d<=INT_MAX && d>=INT_MIN && fabs(((double)item->valueint)-d)<=DBL_EPSILON) 199 | { 200 | if (p) 201 | { 202 | str=queren(p,21); 203 | } 204 | else 205 | { 206 | str=(char*)cJSON_malloc(21); 207 | } 208 | if (str) 209 | { 210 | sprintf(str,"%d",item->valueint); 211 | } 212 | } 213 | else 214 | { 215 | if (p) 216 | { 217 | str=queren(p,64); 218 | } 219 | else 220 | { 221 | str=(char*)cJSON_malloc(64); 222 | } 223 | if (str) 224 | { 225 | if (fabs(d)<1.0e60&&fabs(floor(d)-d)<=DBL_EPSILON) 226 | { 227 | sprintf(str,"%.0f",d); 228 | } 229 | else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) 230 | { 231 | sprintf(str,"%e",d); 232 | } 233 | else 234 | { 235 | sprintf(str,"%f",d); 236 | } 237 | } 238 | } 239 | return str; 240 | } 241 | static unsigned par_h4(const char *str) 242 | { 243 | unsigned h=0; 244 | if (*str<='9'&&*str>='0') 245 | { 246 | h+=(*str)-'0'; 247 | } 248 | else if (*str<='F'&&*str>='A') 249 | { 250 | h+=10+(*str)-'A'; 251 | } 252 | else if (*str<='f'&&*str>='a') 253 | { 254 | h+=10+(*str)-'a'; 255 | } 256 | else 257 | { 258 | return 0; 259 | } 260 | h=h<<4; 261 | str+=1; 262 | if (*str<='9'&&*str>='0') 263 | { 264 | h+=(*str)-'0'; 265 | } 266 | else if (*str<='F'&&*str>='A') 267 | { 268 | h+=10+(*str)-'A'; 269 | } 270 | else if (*str<='f'&&*str>='a') 271 | { 272 | h+=10+(*str)-'a'; 273 | } 274 | else 275 | { 276 | return 0; 277 | } 278 | h=h<<4; 279 | str+=1; 280 | if (*str<='9'&&*str>='0') 281 | { 282 | h+=(*str)-'0'; 283 | } 284 | else if (*str<='F'&&*str>='A') 285 | { 286 | h+=10+(*str)-'A'; 287 | } 288 | else if (*str<='f'&&*str>='a') 289 | { 290 | h+=10+(*str)-'a'; 291 | } 292 | else 293 | { 294 | return 0; 295 | } 296 | h=h<<4; 297 | str+=1; 298 | if (*str<='9'&&*str>='0') 299 | { 300 | h+=(*str)-'0'; 301 | } 302 | else if (*str<='F'&&*str>='A') 303 | { 304 | h+=10+(*str)-'A'; 305 | } 306 | else if (*str<='f'&&*str>='a') 307 | { 308 | h+=10+(*str)-'a'; 309 | } 310 | else 311 | { 312 | return 0; 313 | } 314 | return h; 315 | } 316 | static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; 317 | static const char *par_str(cJSON *item,const char *str) 318 | { 319 | int len=0; 320 | char *out; 321 | const char *ptr=str+1; 322 | char *ptr2; 323 | unsigned ac_a,ac_b; 324 | if (*str!='\"') 325 | { 326 | ep=str; 327 | return 0; 328 | } 329 | while (*ptr && ++len && *ptr!='\"') 330 | { 331 | if (*ptr++ == '\\') 332 | { 333 | ptr+=1; 334 | } 335 | } 336 | out=(char*)cJSON_malloc(len+1); 337 | if (!out) 338 | { 339 | return 0; 340 | } 341 | ptr=str+1; 342 | ptr2=out; 343 | while (*ptr && *ptr!='\"') 344 | { 345 | if (*ptr!='\\') 346 | { 347 | *ptr2++=*ptr++; 348 | } 349 | else 350 | { 351 | ptr+=1; 352 | switch (*ptr) 353 | { 354 | case 'b': *ptr2++='\b'; break; 355 | case 'f': *ptr2++='\f'; break; 356 | case 'n': *ptr2++='\n'; break; 357 | case 'r': *ptr2++='\r'; break; 358 | case 't': *ptr2++='\t'; break; 359 | case 'u': 360 | ac_a=par_h4(ptr+1); 361 | ptr+=4; 362 | if ((ac_a>=0xDC00 && ac_a<=0xDFFF) || ac_a==0) 363 | { 364 | break; 365 | } 366 | if (ac_a>=0xD800 && ac_a<=0xDBFF) 367 | { 368 | if (ptr[1]!='\\' || ptr[2]!='u') 369 | { 370 | break; 371 | } 372 | ac_b=par_h4(ptr+3); 373 | ptr+=6; 374 | if (ac_b<0xDC00 || ac_b>0xDFFF) 375 | { 376 | break; 377 | } 378 | ac_a=0x10000 + (((ac_a&0x3FF)<<10) | (ac_b&0x3FF)); 379 | } 380 | len=4; 381 | if (ac_a<0x80) 382 | { 383 | len=1; 384 | } 385 | else if (ac_a<0x800) 386 | { 387 | len=2; 388 | } 389 | else if (ac_a<0x10000) 390 | { 391 | len=3; 392 | } 393 | ptr2+=len; 394 | switch (len) 395 | { 396 | case 1: *--ptr2 =(ac_a | firstByteMark[len]); 397 | case 2: *--ptr2 =((ac_a | 0x80) & 0xBF); ac_a >>= 6; 398 | case 3: *--ptr2 =((ac_a | 0x80) & 0xBF); ac_a >>= 6; 399 | case 4: *--ptr2 =((ac_a | 0x80) & 0xBF); ac_a >>= 6; 400 | } 401 | ptr2+=len; 402 | break; 403 | default: *ptr2++=*ptr; 404 | break; 405 | } 406 | ptr+=1; 407 | } 408 | } 409 | *ptr2=0; 410 | if (*ptr=='\"') 411 | { 412 | ptr+=1; 413 | } 414 | item->type=JSON_STRING; 415 | item->valuestring=out; 416 | return ptr; 417 | } 418 | static char *prt_str_ptr(const char *str,printbuffer *p) 419 | { 420 | int len=0,flag=0; 421 | const char *ptr; 422 | char *ptr2,*out; 423 | unsigned char tok; 424 | for (ptr=str;*ptr;ptr++) 425 | { 426 | flag|=((*ptr>0 && *ptr<32)||(*ptr=='\"')||(*ptr=='\\'))?1:0; 427 | } 428 | if (!flag) 429 | { 430 | len=ptr-str; 431 | if (p) 432 | { 433 | out=queren(p,len+3); 434 | } 435 | else 436 | { 437 | out=(char*)cJSON_malloc(len+3); 438 | } 439 | if (!out) 440 | { 441 | return 0; 442 | } 443 | ptr2=out; 444 | *ptr2++='\"'; 445 | strcpy(ptr2,str); 446 | ptr2[len]='\"'; 447 | ptr2[len+1]=0; 448 | return out; 449 | } 450 | if (!str) 451 | { 452 | if (p) 453 | { 454 | out=queren(p,3); 455 | } 456 | else 457 | { 458 | out=(char*)cJSON_malloc(3); 459 | } 460 | if (!out) 461 | { 462 | return 0; 463 | } 464 | strcpy(out,"\"\""); 465 | return out; 466 | } 467 | ptr=str; 468 | while ((tok=*ptr) && ++len) 469 | { 470 | if (strchr("\"\\\b\f\n\r\t",tok)) 471 | { 472 | len+=1; 473 | } 474 | else if (tok<=31) 475 | { 476 | len+=5; 477 | } 478 | ptr+=1; 479 | } 480 | if (p) 481 | { 482 | out=queren(p,len+3); 483 | } 484 | else 485 | { 486 | out=(char*)cJSON_malloc(len+3); 487 | } 488 | if (!out) 489 | { 490 | return 0; 491 | } 492 | ptr=str; 493 | ptr2=out; 494 | *ptr2++='\"'; 495 | while (*ptr) 496 | { 497 | if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') 498 | { 499 | *ptr2++=*ptr++; 500 | } 501 | else 502 | { 503 | *ptr2++='\\'; 504 | switch (tok=*ptr++) 505 | { 506 | case '\\': *ptr2++='\\'; break; 507 | case '\"': *ptr2++='\"'; break; 508 | case '\b': *ptr2++='b'; break; 509 | case '\f': *ptr2++='f'; break; 510 | case '\n': *ptr2++='n'; break; 511 | case '\r': *ptr2++='r'; break; 512 | case '\t': *ptr2++='t'; break; 513 | default: sprintf(ptr2,"u%04x",tok);ptr2+=5; 514 | break; 515 | } 516 | } 517 | } 518 | *ptr2++='\"'; 519 | *ptr2++=0; 520 | return out; 521 | } 522 | static char *prt_str(cJSON *item,printbuffer *p) 523 | { 524 | return prt_str_ptr(item->valuestring,p); 525 | } 526 | static const char *par_obj(cJSON *item,const char *value); 527 | static const char *par_val(cJSON *item,const char *value); 528 | static const char *par_arr(cJSON *item,const char *value); 529 | static char *prt_obj(cJSON *item,int dep,int fmt,printbuffer *p); 530 | static char *prt_val(cJSON *item,int dep,int fmt,printbuffer *p); 531 | static char *prt_arr(cJSON *item,int dep,int fmt,printbuffer *p); 532 | static const char *skip(const char *in) 533 | { 534 | while (*in && (unsigned char)*in<=32 && in) 535 | { 536 | in+=1; 537 | } 538 | return in; 539 | } 540 | cJSON *JSON_Par_wit(const char *value,const char **return_parse_end,int req_null_ter) 541 | { 542 | cJSON *c=JSON_xwp(); 543 | const char *end=0; 544 | ep=0; 545 | if (!c) 546 | { 547 | return 0; 548 | } 549 | end=par_val(c,skip(value)); 550 | if (!end) 551 | { 552 | JSON_shanchu(c); 553 | return 0; 554 | } 555 | if (req_null_ter) 556 | { 557 | end=skip(end); 558 | if (*end) 559 | { 560 | JSON_shanchu(c); 561 | ep=end; 562 | return 0; 563 | } 564 | } 565 | if (return_parse_end) 566 | { 567 | *return_parse_end=end; 568 | } 569 | return c; 570 | } 571 | cJSON *JSON_Par(const char *value) 572 | { 573 | return JSON_Par_wit(value,0,0); 574 | } 575 | char *JSON_prt(cJSON *item) 576 | { 577 | return prt_val(item,0,1,0); 578 | } 579 | char *JSON_puf(cJSON *item) 580 | { 581 | return prt_val(item,0,0,0); 582 | } 583 | 584 | char *JSON_pbuf(cJSON *item,int prebuffer,int fmt) 585 | { 586 | printbuffer p; 587 | p.buffer=(char*)cJSON_malloc(prebuffer); 588 | p.length=prebuffer; 589 | p.offset=0; 590 | return prt_val(item,0,fmt,&p); 591 | return p.buffer; 592 | } 593 | static const char *par_val(cJSON *item,const char *value) 594 | { 595 | if (!value) 596 | { 597 | return 0; 598 | } 599 | if (!strncmp(value,"null",4)) 600 | { 601 | item->type=JSON_NULL; 602 | return value+4; 603 | } 604 | if (!strncmp(value,"false",5)) 605 | { 606 | item->type=JSON_FALSE; 607 | return value+5; 608 | } 609 | if (!strncmp(value,"true",4)) 610 | { 611 | item->type=JSON_TRUE; 612 | item->valueint=1; 613 | return value+4; 614 | } 615 | if (*value=='\"') 616 | { 617 | return par_str(item,value); 618 | } 619 | if (*value=='-' || (*value<='9' && *value>='0')) 620 | { 621 | return par_num(item,value); 622 | } 623 | if (*value=='[') 624 | { 625 | return par_arr(item,value); 626 | } 627 | if (*value=='{') 628 | { 629 | return par_obj(item,value); 630 | } 631 | ep=value; 632 | return 0; 633 | } 634 | static char *prt_val(cJSON *item,int dep,int fmt,printbuffer *p) 635 | { 636 | char *out=0; 637 | if (!item) 638 | { 639 | return 0; 640 | } 641 | if (p) 642 | { 643 | switch ((item->type)&255) 644 | { 645 | case JSON_NULL: { 646 | out=queren(p,5); 647 | if (out) 648 | { 649 | strcpy(out,"null"); 650 | } 651 | break; 652 | } 653 | case JSON_FALSE:{ 654 | out=queren(p,6); 655 | if (out) 656 | { 657 | strcpy(out,"false"); 658 | } 659 | break; 660 | } 661 | case JSON_TRUE: { 662 | out=queren(p,5); 663 | if (out) 664 | { 665 | strcpy(out,"true"); 666 | } 667 | break; 668 | } 669 | case JSON_NUM: 670 | out=print_number(item,p); 671 | break; 672 | case JSON_STRING: 673 | out=prt_str(item,p); 674 | break; 675 | case JSON_ARRAY: 676 | out=prt_arr(item,dep,fmt,p); 677 | break; 678 | case JSON_OBJECT: 679 | out=prt_obj(item,dep,fmt,p); 680 | break; 681 | } 682 | } 683 | else 684 | { 685 | switch ((item->type)&255) 686 | { 687 | case JSON_NULL: 688 | out=JSON_chuanlian("null"); 689 | break; 690 | case JSON_FALSE: 691 | out=JSON_chuanlian("false"); 692 | break; 693 | case JSON_TRUE: 694 | out=JSON_chuanlian("true"); 695 | break; 696 | case JSON_NUM: 697 | out=print_number(item,0); 698 | break; 699 | case JSON_STRING: 700 | out=prt_str(item,0); 701 | break; 702 | case JSON_ARRAY: 703 | out=prt_arr(item,dep,fmt,0); 704 | break; 705 | case JSON_OBJECT: 706 | out=prt_obj(item,dep,fmt,0); 707 | break; 708 | } 709 | } 710 | return out; 711 | } 712 | static const char *par_arr(cJSON *item,const char *value) 713 | { 714 | cJSON *child; 715 | if (*value!='[') 716 | { 717 | ep=value; 718 | return 0; 719 | } 720 | value=skip(value+1); 721 | item->type=JSON_ARRAY; 722 | if (*value==']') 723 | { 724 | return value+1; 725 | } 726 | item->child=child=JSON_xwp(); 727 | if (!item->child) 728 | { 729 | return 0; 730 | } 731 | value=skip(par_val(child,skip(value))); 732 | if (!value) 733 | { 734 | return 0; 735 | } 736 | while (*value==',') 737 | { 738 | cJSON *new_item; 739 | if (!(new_item=JSON_xwp())) 740 | { 741 | return 0; 742 | } 743 | child->next=new_item; 744 | new_item->prev=child; 745 | child=new_item; 746 | value=skip(par_val(child,skip(value+1))); 747 | if (!value) 748 | { 749 | return 0; 750 | } 751 | } 752 | if (*value==']') 753 | { 754 | return value+1; 755 | } 756 | ep=value;return 0; 757 | } 758 | static char *prt_arr(cJSON *item,int dep,int fmt,printbuffer *p) 759 | { 760 | char *out=0,*ptr,*ret; 761 | char **entri; 762 | cJSON *child=item->child; 763 | int len=5,nert=0,i=0,fail=0; 764 | size_t tmplen=0; 765 | while (child) 766 | { 767 | nert++,child=child->next; 768 | } 769 | if (!nert) 770 | { 771 | if (p) 772 | { 773 | out=queren(p,3); 774 | } 775 | else 776 | { 777 | out=(char*)cJSON_malloc(3); 778 | } 779 | if (out) 780 | { 781 | strcpy(out,"[]"); 782 | } 783 | return out; 784 | } 785 | if (p) 786 | { 787 | i=p->offset; 788 | ptr=queren(p,1); 789 | if (!ptr) 790 | { 791 | return 0; 792 | } 793 | *ptr='['; 794 | p->offset++; 795 | child=item->child; 796 | while (child && !fail) 797 | { 798 | prt_val(child,dep+1,fmt,p); 799 | p->offset=gengxin(p); 800 | if (child->next) 801 | { 802 | len=fmt?2:1; 803 | ptr=queren(p,len+1); 804 | if (!ptr) 805 | { 806 | return 0; 807 | } 808 | *ptr++=','; 809 | if(fmt) 810 | { 811 | *ptr++=' '; 812 | } 813 | *ptr=0; 814 | p->offset+=len; 815 | } 816 | child=child->next; 817 | } 818 | ptr=queren(p,2); 819 | if (!ptr) 820 | { 821 | return 0; 822 | } 823 | *ptr++=']'; 824 | *ptr=0; 825 | out=(p->buffer)+i; 826 | } 827 | else 828 | { 829 | entri=(char**)cJSON_malloc(nert*sizeof(char*)); 830 | if (!entri) 831 | { 832 | return 0; 833 | } 834 | memset(entri,0,nert*sizeof(char*)); 835 | child=item->child; 836 | while (child && !fail) 837 | { 838 | ret=prt_val(child,dep+1,fmt,0); 839 | entri[i++]=ret; 840 | if (ret) 841 | { 842 | len+=strlen(ret)+2+(fmt?1:0); 843 | } 844 | else 845 | { 846 | fail=1; 847 | } 848 | child=child->next; 849 | } 850 | if (!fail) 851 | { 852 | out=(char*)cJSON_malloc(len); 853 | } 854 | if (!out) 855 | { 856 | fail=1; 857 | } 858 | if (fail) 859 | { 860 | for (i=0;itype=JSON_OBJECT; 904 | value=skip(value+1); 905 | if (*value=='}') 906 | { 907 | return value+1; 908 | } 909 | item->child=child=JSON_xwp(); 910 | if (!item->child) 911 | { 912 | return 0; 913 | } 914 | value=skip(par_str(child,skip(value))); 915 | if (!value) 916 | { 917 | return 0; 918 | } 919 | child->string=child->valuestring; 920 | child->valuestring=0; 921 | if (*value!=':') 922 | { 923 | ep=value; 924 | return 0; 925 | } 926 | value=skip(par_val(child,skip(value+1))); 927 | if (!value) 928 | { 929 | return 0; 930 | } 931 | while (*value==',') 932 | { 933 | cJSON *new_item; 934 | if (!(new_item=JSON_xwp())) 935 | { 936 | return 0; 937 | } 938 | child->next=new_item; 939 | new_item->prev=child; 940 | child=new_item; 941 | value=skip(par_str(child,skip(value+1))); 942 | if (!value) 943 | { 944 | return 0; 945 | } 946 | child->string=child->valuestring; 947 | child->valuestring=0; 948 | if (*value!=':') 949 | { 950 | ep=value; 951 | return 0; 952 | } 953 | value=skip(par_val(child,skip(value+1))); 954 | if (!value) 955 | { 956 | return 0; 957 | } 958 | } 959 | if (*value=='}') 960 | { 961 | return value+1; 962 | } 963 | ep=value; 964 | return 0; 965 | } 966 | static char *prt_obj(cJSON *item,int dep,int fmt,printbuffer *p) 967 | { 968 | char **entri=0,**names=0,*out=0,*ptr,*ret,*str; 969 | int len=7,i=0,j,nert=0,fail=0; 970 | cJSON *child=item->child; 971 | size_t tmplen=0; 972 | while (child) 973 | { 974 | nert++,child=child->next; 975 | } 976 | if (!nert) 977 | { 978 | if (p) 979 | { 980 | out=queren(p,fmt?dep+4:3); 981 | } 982 | else 983 | { 984 | out=(char*)cJSON_malloc(fmt?dep+4:3); 985 | } 986 | if (!out) 987 | { 988 | return 0; 989 | } 990 | ptr=out; 991 | *ptr++='{'; 992 | if (fmt) 993 | { 994 | *ptr++='\n'; 995 | for (i=0;ioffset; 1007 | len=fmt?2:1; 1008 | ptr=queren(p,len+1); 1009 | if (!ptr) 1010 | { 1011 | return 0; 1012 | } 1013 | *ptr++='{'; 1014 | if (fmt) 1015 | { 1016 | *ptr++='\n'; 1017 | } 1018 | *ptr=0; 1019 | p->offset+=len; 1020 | child=item->child; 1021 | dep+=1; 1022 | while (child) 1023 | { 1024 | if (fmt) 1025 | { 1026 | ptr=queren(p,dep); 1027 | if (!ptr) 1028 | { 1029 | return 0; 1030 | } 1031 | for (j=0;joffset+=dep; 1036 | } 1037 | prt_str_ptr(child->string,p); 1038 | p->offset=gengxin(p); 1039 | len=fmt?2:1; 1040 | ptr=queren(p,len); 1041 | if (!ptr) 1042 | { 1043 | return 0; 1044 | } 1045 | *ptr++=':'; 1046 | if (fmt) 1047 | { 1048 | *ptr++='\t'; 1049 | } 1050 | p->offset+=len; 1051 | prt_val(child,dep,fmt,p); 1052 | p->offset=gengxin(p); 1053 | len=(fmt?1:0)+(child->next?1:0); 1054 | ptr=queren(p,len+1); 1055 | if (!ptr) ////////////////////////////////////// 1056 | { 1057 | return 0; 1058 | } 1059 | if (child->next) 1060 | { 1061 | *ptr++=','; 1062 | } 1063 | 1064 | if (fmt) 1065 | { 1066 | *ptr++='\n'; 1067 | } 1068 | *ptr=0; 1069 | p->offset+=len; 1070 | child=child->next; 1071 | } 1072 | ptr=queren(p,fmt?(dep+1):2); 1073 | if (!ptr) //////////////////////////////////////////// 1074 | { 1075 | return 0; 1076 | } 1077 | if (fmt) 1078 | { 1079 | for (i=0;ibuffer)+i; 1087 | } 1088 | else 1089 | { 1090 | entri=(char**)cJSON_malloc(nert*sizeof(char*)); 1091 | if (!entri) 1092 | { 1093 | return 0; 1094 | } 1095 | names=(char**)cJSON_malloc(nert*sizeof(char*)); 1096 | if (!names) 1097 | { 1098 | cJSON_free(entri); 1099 | return 0; 1100 | } 1101 | memset(entri,0,sizeof(char*)*nert); 1102 | memset(names,0,sizeof(char*)*nert); 1103 | child=item->child; 1104 | dep++; 1105 | if (fmt) 1106 | { 1107 | len+=dep; 1108 | } 1109 | while (child) 1110 | { 1111 | names[i]=str=prt_str_ptr(child->string,0); 1112 | entri[i++]=ret=prt_val(child,dep,fmt,0); 1113 | if (str && ret) 1114 | { 1115 | len+=strlen(ret)+strlen(str)+2+(fmt?2+dep:0); 1116 | } 1117 | else 1118 | { 1119 | fail=1; 1120 | } 1121 | child=child->next; 1122 | } 1123 | if (!fail) 1124 | { 1125 | out=(char*)cJSON_malloc(len); 1126 | } 1127 | if (!out) 1128 | { 1129 | fail=1; 1130 | } 1131 | if (fail) 1132 | {///////////////////////////////////////////// 1133 | for (i=0;ichild; 1203 | int i=0; 1204 | while(c)i++,c=c->next; 1205 | return i; 1206 | } 1207 | cJSON *JSON_Get_Arr_Item(cJSON *array,int item) 1208 | { 1209 | cJSON *c=array->child; 1210 | while (c && item>0) item--,c=c->next; 1211 | return c; 1212 | } 1213 | cJSON *JSON_Get_Obj_Item(cJSON *object,const char *string) 1214 | { 1215 | cJSON *c=object->child; 1216 | while (c && JSON_bijiao_str(c->string,string)) c=c->next; 1217 | return c; 1218 | } 1219 | static void suffix_object(cJSON *prev,cJSON *item) 1220 | { 1221 | prev->next=item; 1222 | item->prev=prev; 1223 | } 1224 | static cJSON *create_reference(cJSON *item) 1225 | { 1226 | cJSON *ref=JSON_xwp(); 1227 | if (!ref) 1228 | { 1229 | return 0; 1230 | } 1231 | memcpy(ref,item,sizeof(cJSON)); 1232 | ref->string=0; 1233 | ref->type|=cJSON_IsReference; 1234 | ref->next=ref->prev=0; 1235 | return ref; 1236 | } 1237 | void JSON_Add_Item_To_Arr(cJSON *array, cJSON *item) 1238 | { 1239 | cJSON *c=array->child; 1240 | if (!item) 1241 | { 1242 | return; 1243 | } 1244 | if (!c) 1245 | { 1246 | array->child=item; 1247 | } 1248 | else 1249 | { 1250 | while (c && c->next) c=c->next; 1251 | suffix_object(c,item); 1252 | } 1253 | } 1254 | void JSON_Add_Item_To_Obj(cJSON *object,const char *string,cJSON *item) 1255 | { 1256 | if (!item) return; 1257 | if (item->string) cJSON_free(item->string); 1258 | item->string=JSON_chuanlian(string); 1259 | JSON_Add_Item_To_Arr(object,item); 1260 | } 1261 | void JSON_Add_Item_To_Obj_CS(cJSON *object,const char *string,cJSON *item) 1262 | { 1263 | if (!item) return; 1264 | if (!(item->type&cJSON_StringIsConst) && item->string) 1265 | cJSON_free(item->string); 1266 | item->string=(char*)string;item->type|=cJSON_StringIsConst; 1267 | JSON_Add_Item_To_Arr(object,item); 1268 | } 1269 | void JSON_Add_Item_Ref_To_Arr(cJSON *array, cJSON *item) 1270 | { 1271 | JSON_Add_Item_To_Arr(array,create_reference(item)); 1272 | } 1273 | void JSON_Add_Item_Ref_To_Obj(cJSON *object,const char *string,cJSON *item) 1274 | { 1275 | JSON_Add_Item_To_Obj(object,string,create_reference(item)); 1276 | } 1277 | 1278 | cJSON *JSON_Det_Item_From_Arr(cJSON *array,int which) 1279 | { 1280 | cJSON *c=array->child; 1281 | while (c && which>0) c=c->next,which--; 1282 | if (!c) return 0; 1283 | if (c->prev) //////////////////////////// 1284 | c->prev->next=c->next; 1285 | if (c->next) 1286 | c->next->prev=c->prev; 1287 | if (c==array->child) 1288 | array->child=c->next; 1289 | c->prev=c->next=0; 1290 | return c; 1291 | } 1292 | void JSON_Del_Item_From_Arr(cJSON *array,int which) 1293 | { 1294 | JSON_shanchu(JSON_Det_Item_From_Arr(array,which)); 1295 | } 1296 | cJSON *JSON_Det_Item_From_Obj(cJSON *object,const char *string) 1297 | { 1298 | int i=0; 1299 | cJSON *c=object->child; 1300 | while (c && JSON_bijiao_str(c->string,string)) i++,c=c->next; 1301 | if (c) return JSON_Det_Item_From_Arr(object,i);return 0; 1302 | } 1303 | void JSON_Del_Item_From_Obj(cJSON *object,const char *string) 1304 | { 1305 | JSON_shanchu(JSON_Det_Item_From_Obj(object,string)); 1306 | } 1307 | void JSON_Ins_Item_In_Arr(cJSON *array,int which,cJSON *newitem) 1308 | { 1309 | cJSON *c=array->child; 1310 | while (c && which>0) c=c->next,which--; 1311 | if (!c) 1312 | { 1313 | JSON_Add_Item_To_Arr(array,newitem); 1314 | return; 1315 | } 1316 | newitem->next=c; 1317 | newitem->prev=c->prev;c->prev=newitem; 1318 | if (c==array->child) array->child=newitem; 1319 | else newitem->prev->next=newitem; 1320 | } 1321 | void JSON_Rep_Item_In_Arr(cJSON *array,int which,cJSON *newitem) 1322 | { 1323 | cJSON *c=array->child; 1324 | while (c && which>0) c=c->next,which--; 1325 | if (!c) return; 1326 | newitem->next=c->next;newitem->prev=c->prev; 1327 | if (newitem->next) newitem->next->prev=newitem; 1328 | if (c==array->child) array->child=newitem; 1329 | else newitem->prev->next=newitem; 1330 | c->next=c->prev=0; 1331 | JSON_shanchu(c); 1332 | } 1333 | void JSON_Rep_Item_In_Obj(cJSON *object,const char *string,cJSON *newitem) 1334 | { 1335 | int i=0; 1336 | cJSON *c=object->child; 1337 | while(c && JSON_bijiao_str(c->string,string))i++,c=c->next; 1338 | if(c) 1339 | { 1340 | newitem->string=JSON_chuanlian(string); 1341 | JSON_Rep_Item_In_Arr(object,i,newitem); 1342 | } 1343 | } 1344 | cJSON *JSON_Cre_Null(void) 1345 | { 1346 | cJSON *item=JSON_xwp(); 1347 | if(item)item->type=JSON_NULL; 1348 | return item; 1349 | } 1350 | cJSON *JSON_Cre_True(void) 1351 | { 1352 | cJSON *item=JSON_xwp(); 1353 | if(item)item->type=JSON_TRUE; 1354 | return item; 1355 | } 1356 | cJSON *JSON_Cre_False(void) 1357 | { 1358 | cJSON *item=JSON_xwp(); 1359 | if(item)item->type=JSON_FALSE; 1360 | return item; 1361 | } 1362 | cJSON *JSON_Cre_Bool(int b) 1363 | { 1364 | cJSON *item=JSON_xwp(); 1365 | if(item)item->type=b?JSON_TRUE:JSON_FALSE; 1366 | return item; 1367 | } 1368 | cJSON *JSON_Cre_Num(double num) 1369 | { 1370 | cJSON *item=JSON_xwp(); 1371 | if(item) 1372 | { 1373 | item->type=JSON_NUM; 1374 | item->valuedouble=num; 1375 | item->valueint=(int)num; 1376 | } 1377 | return item; 1378 | } 1379 | cJSON *JSON_Cre_Str(const char *string) 1380 | { 1381 | cJSON *item=JSON_xwp(); 1382 | if(item) 1383 | { 1384 | item->type=JSON_STRING; 1385 | item->valuestring=JSON_chuanlian(string); 1386 | } 1387 | return item; 1388 | } 1389 | cJSON *JSON_Cre_Arr(void) 1390 | { 1391 | cJSON *item=JSON_xwp(); 1392 | if(item)item->type=JSON_ARRAY; 1393 | return item; 1394 | } 1395 | cJSON *JSON_Cre_Obj(void) 1396 | { 1397 | cJSON *item=JSON_xwp(); 1398 | if(item)item->type=JSON_OBJECT; 1399 | return item; 1400 | } 1401 | cJSON *JSON_Cre_Int_Arr(const int *numbers,int count) 1402 | { 1403 | int i; 1404 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1405 | for(i=0;a && ichild=n; 1409 | else suffix_object(p,n); 1410 | p=n; 1411 | } 1412 | return a; 1413 | } 1414 | cJSON *JSON_Cre_Float_Arr(const float *numbers,int count) 1415 | { 1416 | int i; 1417 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1418 | for(i=0;a && ichild=n; 1422 | else suffix_object(p,n); 1423 | p=n; 1424 | } 1425 | return a; 1426 | } 1427 | cJSON *JSON_Cre_Double_Arr(const double *numbers,int count) 1428 | { 1429 | int i; 1430 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1431 | for(i=0;a && ichild=n; 1435 | else suffix_object(p,n); 1436 | p=n; 1437 | } 1438 | return a; 1439 | } 1440 | cJSON *JSON_Cre_Str_Arr(const char **strings,int count) 1441 | { 1442 | int i; 1443 | cJSON *n=0,*p=0,*a=JSON_Cre_Arr(); 1444 | for(i=0;a && ichild=n; 1448 | else suffix_object(p,n); 1449 | p=n; 1450 | } 1451 | return a; 1452 | } 1453 | cJSON *JSON_Dup(cJSON *item,int recurse) 1454 | { 1455 | cJSON *newitem,*cptr,*nptr=0,*newchild; 1456 | if (!item) return 0; 1457 | newitem=JSON_xwp(); 1458 | if (!newitem) return 0; 1459 | newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble; 1460 | if (item->valuestring) 1461 | { 1462 | newitem->valuestring=JSON_chuanlian(item->valuestring); 1463 | if (!newitem->valuestring) 1464 | { 1465 | JSON_shanchu(newitem); 1466 | return 0; 1467 | } 1468 | } 1469 | if (item->string) 1470 | { 1471 | newitem->string=JSON_chuanlian(item->string); 1472 | if (!newitem->string) 1473 | { 1474 | JSON_shanchu(newitem); 1475 | return 0; 1476 | } 1477 | } 1478 | if (!recurse) return newitem; 1479 | cptr=item->child; 1480 | while (cptr) 1481 | { 1482 | newchild=JSON_Dup(cptr,1); 1483 | if (!newchild) 1484 | { 1485 | JSON_shanchu(newitem); 1486 | return 0; 1487 | } 1488 | if (nptr) 1489 | { 1490 | nptr->next=newchild,newchild->prev=nptr; 1491 | nptr=newchild; 1492 | } 1493 | else 1494 | { 1495 | newitem->child=newchild; 1496 | nptr=newchild; 1497 | } 1498 | cptr=cptr->next; 1499 | } 1500 | return newitem; 1501 | } 1502 | void JSON_Minify(char *json) 1503 | { 1504 | char *into=json; 1505 | while (*json) 1506 | { 1507 | if (*json==' ') json++; 1508 | else if (*json=='\t') json++; 1509 | else if (*json=='\r') json++; 1510 | else if (*json=='\n') json++; 1511 | else if (*json=='/' && json[1]=='/') while (*json && *json!='\n') json++; 1512 | else if (*json=='/' && json[1]=='*') 1513 | { 1514 | while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2; 1515 | } 1516 | else if (*json=='\"') 1517 | { 1518 | *into++=*json++; 1519 | while (*json && *json!='\"') 1520 | { 1521 | if (*json=='\\') *into++=*json++; 1522 | *into++=*json++; 1523 | } 1524 | *into++=*json++; 1525 | } 1526 | else *into++=*json++; 1527 | } 1528 | *into=0; 1529 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/src/JSON.h: -------------------------------------------------------------------------------- 1 | #ifndef cJSON__h 2 | #define cJSON__h 3 | #ifdef __cplusplus 4 | extern "C" 5 | { 6 | #endif 7 | #define cJSON_StringIsConst 512 8 | #define cJSON_IsReference 256 9 | #define JSON_OBJECT 6 10 | #define JSON_ARRAY 5 11 | #define JSON_STRING 4 12 | #define JSON_NUM 3 13 | #define JSON_NULL 2 14 | #define JSON_TRUE 1 15 | #define JSON_FALSE 0 16 | typedef struct cJSON 17 | { 18 | struct cJSON *next; 19 | struct cJSON *child; 20 | struct cJSON *prev; 21 | int type,valueint; 22 | char *string,*valuestring; 23 | double valuedouble; 24 | } cJSON; 25 | typedef struct JSON_gouzi 26 | { 27 | void (*free_fn)(void *ptr); 28 | void *(*malloc_fn)(size_t sz); 29 | } JSON_gouzi ; 30 | extern void JSON_csh_gouzi(JSON_gouzi * hooks); 31 | extern cJSON *JSON_Par(const char *value); 32 | extern char *JSON_prt(cJSON *item); 33 | extern char *JSON_puf(cJSON *item); 34 | extern char *JSON_pbuf(cJSON *item,int prebuffer,int fmt); 35 | extern void JSON_shanchu(cJSON *c); 36 | extern int JSON_Get_Arr_Siz(cJSON *array); 37 | extern cJSON *JSON_Get_Arr_Item(cJSON *array,int item); 38 | extern cJSON *JSON_Get_Obj_Item(cJSON *object,const char *string); 39 | extern const char *JSON_cuowuzhizhen(void); 40 | extern cJSON *JSON_Cre_Null(void); 41 | extern cJSON *JSON_Cre_True(void); 42 | extern cJSON *JSON_Cre_False(void); 43 | extern cJSON *JSON_Cre_Bool(int b); 44 | extern cJSON *JSON_Cre_Num(double num); 45 | extern cJSON *JSON_Cre_Obj(void); 46 | extern cJSON *JSON_Cre_Str(const char *string); 47 | extern cJSON *JSON_Cre_Arr(void); 48 | extern cJSON *JSON_Cre_Int_Arr(const int *numbers,int count); 49 | extern cJSON *JSON_Cre_Double_Arr(const double *numbers,int count); 50 | extern void JSON_Add_Item_To_Obj(cJSON *object,const char *string,cJSON *item); 51 | extern cJSON *JSON_Cre_Str_Arr(const char **strings,int count); 52 | extern void JSON_Add_Item_To_Arr(cJSON *array, cJSON *item); 53 | extern cJSON *JSON_Cre_Float_Arr(const float *numbers,int count); 54 | extern void JSON_Add_Item_To_Obj_CS(cJSON *object,const char *string,cJSON *item); 55 | extern void JSON_Add_Item_Ref_To_Arr(cJSON *array, cJSON *item); 56 | extern void JSON_Add_Item_Ref_To_Obj(cJSON *object,const char *string,cJSON *item); 57 | extern void JSON_Del_Item_From_Arr(cJSON *array,int which); 58 | extern cJSON *JSON_Det_Item_From_Arr(cJSON *array,int which); 59 | extern cJSON *JSON_Det_Item_From_Obj(cJSON *object,const char *string); 60 | extern void JSON_Ins_Item_In_Arr(cJSON *array,int which,cJSON *newitem); 61 | extern void JSON_Rep_Item_In_Arr(cJSON *array,int which,cJSON *newitem); 62 | extern void JSON_Del_Item_From_Obj(cJSON *object,const char *string); 63 | extern void JSON_Rep_Item_In_Obj(cJSON *object,const char *string,cJSON *newitem); 64 | extern cJSON *JSON_Dup(cJSON *item,int recurse); 65 | extern cJSON *JSON_Par_wit(const char *value,const char **return_parse_end,int req_null_ter); 66 | extern void JSON_Minify(char *json); 67 | #define cJSON_AddNullToObject(object,name) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Null()) 68 | #define cJSON_AddTrueToObject(object,name) JSON_Add_Item_To_Obj(object, name, JSON_Cre_True()) 69 | #define cJSON_AddFalseToObject(object,name) JSON_Add_Item_To_Obj(object, name, JSON_Cre_False()) 70 | #define cJSON_AddBoolToObject(object,name,b) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Bool(b)) 71 | #define cJSON_AddNumberToObject(object,name,n) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Num(n)) 72 | #define cJSON_AddStringToObject(object,name,s) JSON_Add_Item_To_Obj(object, name, JSON_Cre_Str(s)) 73 | #define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) 74 | #define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) 75 | #ifdef __cplusplus 76 | } 77 | #endif 78 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/src/List.h: -------------------------------------------------------------------------------- 1 | #ifndef LIST_H_ 2 | #define LIST_H_ 3 | #include 4 | #include 5 | #define List_Init(list, list_node_t) {list=(list_node_t*)malloc(sizeof(list_node_t));(list)->next=NULL;} 6 | #define List_Free(list, list_node_t) {assert(NULL!=list);list_node_t *tmpPtr;while(NULL!=(tmpPtr=(list)->next)){(list)->next=tmpPtr->next;free(tmpPtr);}} 7 | #define List_Destroy(list, list_node_t) {assert(NULL!=list);List_Free(list, list_node_t)free(list); (list)=NULL;} 8 | #define List_For_Each(list, cur_Pos)for ( cur_Pos = (list)->next;cur_Pos != NULL;cur_Pos=cur_Pos->next) 9 | #define List_AddHead(list, newNode) {(newNode)->next=(list)->next;(list)->next=newNode;} 10 | #define List_AddTail(list, cur_Pos ,newNode) {for(cur_Pos = (list); ;cur_Pos=cur_Pos->next){if((cur_Pos)->next == NULL){(cur_Pos)->next = (newNode);break;}}} 11 | #define List_InsertBefore(node, newNode) {(newNode)->prev=(node)->prev;(node)->prev->next=newNode;(node)->prev=newNode;(newNode)->next=node;} 12 | #define List_InsertAfter(node, newNode) {(newNode)->next=node->next;(node)->next=newNode;} 13 | #define List_IsEmpty(list) (((list) != NULL) 14 | #define List_FreeNode(head ,node,list_node_t) {assert(NULL!=node);if(node -> next != NULL){list_node_t *temp = node->next;memcpy(node,temp,sizeof(list_node_t));free(temp); }else{list_node_t *temp = head;while(temp -> next != node) temp = temp -> next; temp -> next = NULL;free(node); node = NULL; }} 15 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srv.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "src/JSON.h" 5 | #include "srvv/MySQL.h" 6 | #include "service/CONNECT.h" 7 | int main() 8 | { 9 | char buf[1000],host[50] ,user[30],pass[50],database[50]; 10 | int fd = open("config.json" ,O_RDONLY); 11 | if(fd == -1) 12 | { 13 | printf("打开配置文件失败!"); 14 | getchar(); 15 | exit(0); 16 | } 17 | read(fd ,buf ,1024); 18 | cJSON* root = JSON_Par(buf); 19 | cJSON* item = JSON_Get_Obj_Item(root ,"host"); 20 | strcpy(host ,item -> valuestring); 21 | item = JSON_Get_Obj_Item(root ,"user"); 22 | strcpy(user ,item -> valuestring); 23 | item = JSON_Get_Obj_Item(root ,"pass"); 24 | strcpy(pass ,item -> valuestring); 25 | item = JSON_Get_Obj_Item(root ,"database"); 26 | strcpy(database ,item -> valuestring); 27 | item = JSON_Get_Obj_Item(root ,"port"); 28 | int port = item -> valueint; 29 | close(fd); 30 | JSON_shanchu(root); 31 | if(MYSQL_CONNECT(host ,user ,pass ,database) == 0) 32 | { 33 | printf("数据库连接失败!是不是没开数据库呢!\n"); 34 | exit(0); 35 | } 36 | Connect(port); 37 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/ACC_PER.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "ACC_PER.h" 5 | #include "MySQL.h" 6 | #include "../service/FRI_SRV.h" 7 | extern MYSQL * mysql; 8 | int Acc_Per_Ch_Is_Onl(int uid ,int is_online) 9 | { 10 | char SQL[100]; 11 | sprintf(SQL ,"UPDATE account SET is_online = '%d' WHERE uid = '%d'" ,is_online ,uid); 12 | if(mysql_real_query(mysql , SQL , strlen(SQL))) 13 | { 14 | printf("%s\n",mysql_error(mysql)); 15 | return 0; 16 | } 17 | return 1; 18 | } 19 | int Acct_Per_Is_user_Name(const char * name) 20 | { 21 | int rtn = 0; 22 | char SQL[100]; 23 | MYSQL_RES * res; 24 | MYSQL_ROW row; 25 | sprintf(SQL,"SELECT uid FROM account WHERE name = '%s'",name); 26 | if(mysql_real_query(mysql , SQL , strlen(SQL))) 27 | { 28 | return 0; 29 | } 30 | res = mysql_store_result(mysql); 31 | row = mysql_fetch_row(res); 32 | if(row) 33 | { 34 | rtn = atoi(row[0]); 35 | } 36 | mysql_free_result(res); 37 | return rtn; 38 | } 39 | int Acc_Per_Add_User(const char *name ,int sex , const char *password) 40 | { 41 | char SQL[100]; 42 | sprintf(SQL,"INSERT INTO account VALUES (NULL , '%s' ,'%d' , 0, 0 , md5('%s'))", name ,sex , password); 43 | if(mysql_real_query(mysql , SQL , strlen(SQL))) 44 | { 45 | printf("%s\n",mysql_error(mysql)); 46 | return 0; 47 | } 48 | return 1; 49 | } 50 | int Acc_Per_Mat_User_And_Password(int uid , const char * password) 51 | { 52 | int rtn; 53 | char SQL[100]; 54 | MYSQL_RES * res; 55 | MYSQL_ROW row; 56 | sprintf(SQL,"SELECT * FROM account WHERE (uid = '%d' AND password = md5('%s'))" , uid , password); 57 | if(mysql_real_query(mysql , SQL ,strlen(SQL))) 58 | { 59 | return 0; 60 | } 61 | res = mysql_store_result(mysql); 62 | row = mysql_fetch_row(res); 63 | if(row) 64 | { 65 | rtn = 1; 66 | } 67 | else 68 | { 69 | rtn = 0; 70 | } 71 | mysql_free_result(res); 72 | return rtn; 73 | } 74 | char * Acc_Per_Get_User_Name_From_Uid(int uid) 75 | { 76 | MYSQL_RES *res; 77 | MYSQL_ROW row; 78 | char * rtn = NULL; 79 | char SQL[100]; 80 | sprintf(SQL, "SELECT name FROM account WHERE uid = '%d'" ,uid); 81 | if(mysql_real_query(mysql , SQL ,strlen(SQL))) 82 | { 83 | printf("%s\n" ,mysql_error(mysql)); 84 | return 0; 85 | } 86 | res = mysql_store_result(mysql); 87 | row = mysql_fetch_row(res); 88 | if(row) 89 | { 90 | rtn = (char *)malloc(sizeof(char) * 30); 91 | strcpy(rtn ,row[0]); 92 | } 93 | mysql_free_result(res); 94 | return rtn; 95 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/ACC_PER.h: -------------------------------------------------------------------------------- 1 | #ifndef _ACCOUNT_PERSIST_H 2 | #define _ACCOUNT_PERSIST_H 3 | int Acc_Per_Ch_Is_Onl(int uid ,int is_online); 4 | int Acct_Per_Is_user_Name(const char * name); 5 | int Acc_Per_Add_User(const char * name ,int sex, const char *password); 6 | int Acc_Per_Mat_User_And_Password(int uid , const char * password); 7 | char * Acc_Per_Get_User_Name_From_Uid(int uid); 8 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/CHAT_PER.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include"./CHAT_PER.h" 5 | #include 6 | extern MYSQL *mysql; 7 | int Chat_Per_Priva(int from_uid ,int to_uid ,const char *msg, int is_offline) 8 | { 9 | char SQL[100 + strlen(msg)]; 10 | sprintf(SQL , "INSERT INTO private_rec VALUES('%d' ,'%d' ,'%s','%d')" ,from_uid ,to_uid ,msg ,is_offline); 11 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 12 | { 13 | printf("%s",mysql_error(mysql)); 14 | return 0; 15 | } 16 | return 1; 17 | } 18 | int Chat_Per_Gro(int uid ,int gid ,const char *msg, const char *offlist) 19 | { 20 | char SQL[100 + strlen(msg)]; 21 | sprintf(SQL , "INSERT INTO group_rec VALUES('%d' ,'%d' ,'%s','%s')" ,gid ,uid ,msg ,offlist); 22 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 23 | { 24 | printf("%s",mysql_error(mysql)); 25 | return 0; 26 | } 27 | return 1; 28 | } 29 | MYSQL_RES * Chat_Per_Get_Offline_Priva_Msg(int uid) 30 | { 31 | char SQL[100]; 32 | MYSQL_RES *res; 33 | sprintf(SQL,"SELECT msg FROM private_rec WHERE (to_uid = '%d' AND is_offline = 1)" ,uid); 34 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 35 | { 36 | printf("%s\n",mysql_error(mysql)); 37 | return NULL; 38 | } 39 | res = mysql_store_result(mysql); 40 | sprintf(SQL, "UPDATE private_rec set is_offline = '0' WHERE to_uid = '%d'" ,uid); 41 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 42 | { 43 | printf("%s\n",mysql_error(mysql)); 44 | return NULL; 45 | } 46 | return res; 47 | } 48 | MYSQL_RES *Chat_Per_Get_Priva_Rec(int uid ,int fuid) 49 | { 50 | char SQL[200]; 51 | sprintf(SQL ,"SELECT msg FROM private_rec WHERE ((to_uid = '%d' AND from_uid = '%d')" " OR (to_uid = '%d' AND from_uid = '%d'))" ,uid ,fuid, fuid ,uid); 52 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 53 | { 54 | printf("%s\n",mysql_error(mysql)); 55 | return NULL; 56 | } 57 | return mysql_store_result(mysql); 58 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/CHAT_PER.h: -------------------------------------------------------------------------------- 1 | #ifndef _CHAT_PERSIST_H 2 | #define _CHAT_PERSIST_H 3 | #include 4 | int Chat_Per_Gro(int uid ,int gid ,const char *msg ,const char *offlist); 5 | int Chat_Per_Priva(int from_uid ,int to_uid ,const char *msg ,int is_offline); 6 | MYSQL_RES *Chat_Per_Get_Priva_Rec(int uid ,int fuid); 7 | MYSQL_RES* Chat_Per_Get_Offline_Priva_Msg(int uid); 8 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/FRI_PER.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include"FRI_PER.h" 3 | #include"../service/FRI_SRV.h" 4 | #include"../src/List.h" 5 | extern MYSQL* mysql; 6 | int Fri_Per_Add(int uid ,int fuid) 7 | { 8 | char SQL[100]; 9 | sprintf(SQL ,"INSERT INTO friends VALUES('%d' ,'%d' ,'0' ,'0')",uid ,fuid); 10 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 11 | { 12 | printf("%s",mysql_error(mysql)); 13 | return 0; 14 | } 15 | return 1; 16 | } 17 | int Fri_Per_App(int uid ,int fuid ,int is_agree) 18 | { 19 | char SQL[100]; 20 | if(is_agree) 21 | { 22 | sprintf(SQL ,"UPDATE friends SET state = '1' WHERE (uid ='%d' AND fuid = '%d')",uid ,fuid); 23 | } 24 | else 25 | { 26 | sprintf(SQL ,"DELETE FROM friends WHERE uid = '%d' AND fuid = '%d'",uid ,fuid); 27 | } 28 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 29 | { 30 | printf("%s",mysql_error(mysql)); 31 | return 0; 32 | } 33 | return 1; 34 | } 35 | int Fri_Per_Get_List(friends_t * fri_list ,int uid) 36 | { 37 | MYSQL_ROW row ,_row; 38 | MYSQL_RES * res , *_res; 39 | char SQL[100]; 40 | friends_t *NewNode = NULL; 41 | sprintf(SQL ,"SELECT * FROM friends WHERE (uid = '%d' OR fuid = '%d')" ,uid ,uid); 42 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 43 | { 44 | printf("%s",mysql_error(mysql)); 45 | return 0; 46 | } 47 | res = mysql_store_result(mysql); 48 | while((row = mysql_fetch_row(res))) 49 | { 50 | NewNode = (friends_t *)malloc(sizeof(friends_t)); 51 | NewNode -> uid = atoi(row[(uid != atoi(row[1]))]); 52 | NewNode -> is_follow = atoi(row[2]); 53 | NewNode -> state = atoi(row[3]); 54 | sprintf(SQL ,"SELECT * FROM account WHERE uid = '%d'" ,NewNode -> uid); 55 | mysql_real_query(mysql ,SQL,strlen(SQL)); 56 | _res = mysql_store_result(mysql); 57 | _row = mysql_fetch_row(_res); 58 | strcpy(NewNode -> name ,_row[1]); 59 | NewNode -> sex = atoi(_row[2]); 60 | NewNode -> is_vip = atoi(_row[3]); 61 | NewNode -> is_online = atoi(_row[4]); 62 | List_AddHead(fri_list ,NewNode); 63 | mysql_free_result(_res); 64 | } 65 | mysql_free_result(res); 66 | return 1; 67 | } 68 | int Fri_Per_Get_Fri_Info(friends_t *Node) 69 | { 70 | char SQL[100]; 71 | MYSQL_ROW row; 72 | MYSQL_RES *res; 73 | sprintf(SQL ,"SELECT * FROM account WHERE uid = '%d'" ,Node -> uid); 74 | mysql_real_query(mysql ,SQL, strlen(SQL)); 75 | res = mysql_store_result(mysql); 76 | row = mysql_fetch_row(res); 77 | strcpy(Node -> name ,row[1]); 78 | Node -> sex = atoi(row[2]); 79 | Node -> is_vip = atoi(row[3]); 80 | Node -> is_online = atoi(row[4]); 81 | Node -> is_follow = 0; 82 | Node -> state = 0; 83 | mysql_free_result(res); 84 | return 1; 85 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/FRI_PER.h: -------------------------------------------------------------------------------- 1 | #ifndef _FRIENDS_PERSIST_H 2 | #define _FRIENDS_PERSIST_H 3 | #include"../service/FRI_SRV.h" 4 | #include 5 | int Fri_Per_Add(int uid ,int fuid); 6 | int Fri_Per_Get_List(friends_t * fri_list ,int uid); 7 | int Fri_Per_App(int uid ,int fuid ,int is_argee); 8 | int Fri_Per_Get_Fri_Info(friends_t * Node ); 9 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/GRO_PER.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include"./MySQL.h" 4 | #include"../src/List.h" 5 | #include"./GRO_PER.h" 6 | #include"../service/GROUP_SRV.h" 7 | #include"../service/GROUP_SRV.h" 8 | extern MYSQL *mysql; 9 | int Gro_Per_Is_Gro(const char *name) 10 | { 11 | int rtn = 0; 12 | char SQL[100]; 13 | MYSQL_RES * res; 14 | MYSQL_ROW row; 15 | sprintf(SQL,"SELECT gid FROM groups WHERE name = '%s'",name); 16 | if(mysql_real_query(mysql , SQL , strlen(SQL))) 17 | { 18 | printf("%s\n",mysql_error(mysql)); 19 | return 0; 20 | } 21 | res = mysql_store_result(mysql); 22 | row = mysql_fetch_row(res); 23 | if(row) 24 | { 25 | rtn = atoi(row[0]); 26 | } 27 | mysql_free_result(res); 28 | return rtn; 29 | } 30 | int Gro_Per_Cre(int uid ,const char *name) 31 | { 32 | int gid; 33 | char SQL[100]; 34 | sprintf(SQL ,"INSERT INTO groups VALUES(NULL ,'%s', '%d' , 1)", name ,uid); 35 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 36 | { 37 | printf("%s\n" ,mysql_error(mysql)); 38 | return 0; 39 | } 40 | sprintf(SQL ,"SELECT LAST_INSERT_ID()"); 41 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 42 | { 43 | printf("%s\n" ,mysql_error(mysql)); 44 | return 0; 45 | } 46 | MYSQL_RES *res = mysql_store_result(mysql); 47 | MYSQL_ROW row = mysql_fetch_row(res); 48 | gid = atoi(row[0]); 49 | sprintf(SQL ,"INSERT INTO group_member VALUES('%d' ,'%d','2' ,'1')",gid ,uid); 50 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 51 | { 52 | printf("%s\n" ,mysql_error(mysql)); 53 | return 0; 54 | } 55 | return gid; 56 | } 57 | int Gro_Per_Add_Mem(int gid ,int uid ) 58 | { 59 | char SQL[100]; 60 | sprintf(SQL ,"INSERT INTO group_member VALUES('%d' ,'%d','0' ,'1')",gid ,uid); 61 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 62 | { 63 | printf("%s\n" ,mysql_error(mysql)); 64 | return 0; 65 | } 66 | return 1; 67 | } 68 | int Gro_Per_Del_Mem(int gid ,int uid) 69 | { 70 | char SQL[100]; 71 | sprintf(SQL ,"DELETE FROM group_member WHERE (gid = '%d' AND uid ='%d')", gid ,uid); 72 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 73 | { 74 | printf("%s",mysql_error(mysql)); 75 | return 0; 76 | } 77 | return 1; 78 | } 79 | int Gro_Per_Del(int gid) 80 | { 81 | char SQL[100]; 82 | sprintf(SQL ,"DELETE FROM groups WHERE gid = '%d'",gid); 83 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 84 | { 85 | printf("%s\n",mysql_error(mysql)); 86 | return 0; 87 | } 88 | sprintf(SQL,"DELETE FROM group_member WHERE gid = '%d'" ,gid); 89 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 90 | { 91 | printf("%s\n",mysql_error(mysql)); 92 | return 0; 93 | } 94 | return 1; 95 | } 96 | int Gro_Per_Get_Gro_a(group_t *MyGroupList ,int uid) 97 | { 98 | char SQL[100]; 99 | MYSQL_ROW row ; 100 | MYSQL_RES *res ; 101 | group_t *NewNode; 102 | sprintf(SQL ,"SELECT gid FROM group_member WHERE uid = '%d'",uid); 103 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 104 | { 105 | printf("%s",mysql_error(mysql)); 106 | return 0; 107 | } 108 | res = mysql_store_result(mysql); 109 | while((row = mysql_fetch_row(res))) 110 | { 111 | NewNode = Gro_Per_Get_Info(atoi(row[0])); 112 | List_AddHead(MyGroupList ,NewNode); 113 | } 114 | mysql_free_result(res); 115 | return 1; 116 | } 117 | int Gro_Per_Get_Gro_Mem(group_member_t* GroupMember,int gid) 118 | { 119 | MYSQL_ROW row ,_row; 120 | MYSQL_RES *res,*_res; 121 | char SQL[100]; 122 | group_member_t *NewNode; 123 | sprintf(SQL ,"SELECT * FROM group_member WHERE gid = '%d'" ,gid); 124 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 125 | { 126 | printf("%s",mysql_error(mysql)); 127 | return 0; 128 | } 129 | res = mysql_store_result(mysql); 130 | while((row = mysql_fetch_row(res))) 131 | { 132 | sprintf(SQL ,"SELECT * FROM account WHERE uid = '%s'" ,row[1]); 133 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 134 | { 135 | printf("%s",mysql_error(mysql)); 136 | return 0; 137 | } 138 | _res = mysql_store_result(mysql); 139 | _row = mysql_fetch_row(_res); 140 | NewNode = (group_member_t *)malloc(sizeof(group_member_t)); 141 | NewNode -> gid = atoi(row[0]); 142 | NewNode -> user_info.uid = atoi(row[1]); 143 | strcpy(NewNode -> user_info.name ,_row[1]); 144 | NewNode -> user_info.sex = atoi(_row[2]); 145 | NewNode -> user_info.is_vip = atoi(_row[3]); 146 | NewNode -> user_info.is_online = atoi(_row[4]); 147 | NewNode -> user_info.is_follow = 0; 148 | NewNode -> user_info.state = 0; 149 | NewNode -> user_info.next = NULL; 150 | NewNode -> permission = atoi(row[2]); 151 | List_AddHead(GroupMember ,NewNode); 152 | mysql_free_result(_res); 153 | } 154 | mysql_free_result(res); 155 | return 1; 156 | } 157 | group_t * Gro_Per_Get_Info(int gid) 158 | { 159 | MYSQL_ROW row; 160 | MYSQL_RES *res; 161 | char SQL[100]; 162 | group_t *NewNode = (group_t *)malloc(sizeof(group_t)); 163 | NewNode -> gid = gid; 164 | sprintf(SQL,"SELECT * FROM groups WHERE gid = '%d'",NewNode -> gid); 165 | if(mysql_real_query(mysql ,SQL ,strlen(SQL))) 166 | { 167 | printf("%s",mysql_error(mysql)); 168 | return 0; 169 | } 170 | res = mysql_store_result(mysql); 171 | row = mysql_fetch_row(res); 172 | strcpy(NewNode -> name ,row[1]); 173 | NewNode -> owner = atoi(row[2]); 174 | NewNode -> num = atoi(row[3]); 175 | mysql_free_result(res); 176 | return NewNode; 177 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/GRO_PER.h: -------------------------------------------------------------------------------- 1 | #ifndef _GROUP_PERSIST_H 2 | #define _GROUP_PERSIST_H 3 | #include "../service/GROUP_SRV.h" 4 | int Gro_Per_Is_Gro(const char *gname); 5 | int Gro_Per_Cre(int uid ,const char *name); 6 | int Gro_Per_Add_Mem(int gid ,int uid); 7 | int Gro_Per_Del_Mem(int gid ,int uid); 8 | int Gro_Per_Del(int gid); 9 | int Gro_Per_Get_Gro_a(group_t *MyGroupList ,int uid); 10 | int Gro_Per_Get_Gro_Mem(group_member_t* GroupMember,int gid); 11 | group_t * Gro_Per_Get_Info(int gid); 12 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/MySQL.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "MySQL.h" 3 | MYSQL * mysql; 4 | int MYSQL_CONNECT(const char *host ,const char *user ,const char *pass ,const char *database) 5 | { 6 | mysql = mysql_init(NULL); 7 | if(mysql_real_connect(mysql,host,user,pass,database,0,NULL,0) == 0) 8 | { 9 | return 0; 10 | } 11 | return 1; 12 | } 13 | void MySQL_Close() 14 | { 15 | mysql_close(mysql); 16 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/Server/srvv/MySQL.h: -------------------------------------------------------------------------------- 1 | #ifndef _MYSQL_H 2 | #define _MYSQL_H 3 | #include 4 | int MYSQL_CONNECT(const char *host ,const char *user ,const char *pass ,const char *database); 5 | void MySQL_Close(); 6 | #endif -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-1.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-2.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-3.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/1-4.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/2-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/2-1.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/2-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/2-2.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/2-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/2-3.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/copy.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/copy.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/easy_shell1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/easy_shell1.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/easy_shell2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/easy_shell2.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/测试截图/juzhen.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/测试截图/juzhen.PNG -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/01.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | mkdir a b #创建文件夹a和b 3 | chmod 777 /home/linuxcc/桌面/test/a #赋予权限 4 | chmod 777 /home/linuxcc/桌面/test/b 5 | cd a #进入文件夹a 6 | echo "hello world!">helloworld.c #创建文本 7 | echo "你好世界!">nihaoshijie.c 8 | echo "ohayo_sekai!">ohayosekai.c 9 | echo "ohayo_sekai!">test01.txt 10 | echo -n "这里是文件夹a下面的文件" 11 | ls #显示目录 12 | dir="/home/linuxcc/桌面/test/b" 13 | for i in *.c 14 | 15 | do 16 | mv $i $dir #移动文件 17 | done 18 | echo -n "这里是文件夹a下面的文件,可以发现文件夹只剩下txt文件了。" 19 | ls 20 | echo -n "这里是文件夹b下面的文件,a的.c文件全部移动到了这里。" 21 | ls $dir -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/02.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | i=1 3 | ans=1 4 | for((i=1;i<=20;i++)) 5 | do 6 | ans=`expr $ans \* $i` #不断相乘 7 | done 8 | 9 | echo $ans -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/03.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | str="I am oldboy teacher welcome to oldboy training class" 3 | for i in ${str} 4 | do 5 | if [ ${#i} -le 6 ] #如果小于等于6则输出 6 | then 7 | echo ${i} 8 | fi 9 | done -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/04.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cot=0 3 | ave=0 4 | 5 | while read file #读取文件内容 6 | do 7 | let cot++ #总共多少数字 8 | let ans+=$file 9 | if [ $cot -eq 1 ];then #等于1就直接赋值最开始的数字 10 | max=$file 11 | min=$file 12 | fi 13 | [ "$min" -gt "$file" ]&&min=$file #大于的话就重新赋值 14 | [ "$max" -lt "$file" ]&&max=$file #小于的话就重新赋值 15 | 16 | 17 | done 2 | #include "b2.h" 3 | int fibonacci(int num) 4 | { 5 | if(num < 1) 6 | { 7 | return 0; 8 | }else if(num <= 2) 9 | { 10 | return 1; 11 | }else{ 12 | return (fibonacci(num-1)+fibonacci(num-2)); 13 | } 14 | //return res; 15 | } -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/b2.h: -------------------------------------------------------------------------------- 1 | int fibonacci(int num); -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/b3.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/b3.o -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/b4.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/b4.so -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/dll.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/dll.out -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/file: -------------------------------------------------------------------------------- 1 | 100 2 | 200 3 | 300 4 | 400 5 | 500 6 | 600 7 | 700 8 | 800 9 | 900 10 | 1000 11 | -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/libb4.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/libb4.so -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "b2.h" 6 | int main() 7 | { 8 | clock_t sta,end; 9 | double time; 10 | sta=clock(); 11 | int i; 12 | for(i = 1;i < 40;i++) 13 | { 14 | //int res = fibonacci(50); 15 | printf("%d\n",fibonacci(i)); 16 | }; 17 | end=clock(); 18 | time=(double)(end-sta)/CLOCKS_PER_SEC; 19 | printf("Time is %f s\n",time); 20 | return 0; 21 | } 22 | 23 | -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/nodll.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第一次平时作业/nodll.out -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第三次平时作业/lab3.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第三次平时作业/lab3.c -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/06.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "input number:" 3 | read n #循环20次操作 4 | for((i=1;i<=20;i++)) 5 | do 6 | time=$(date "+%Y-%m-%d-%H:%M:%S") #显示当前时间 7 | echo $time 8 | sleep $n #休息n秒 9 | done -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/07.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Input str:" 4 | read str 5 | grep -rn "$str" * #输出包含关键字的所有文件 -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/08-a.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ls -l |grep "^d" #只输出目录 -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/copy.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/copy.c -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/juzhen.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/其他小程序/第二次平时作业/juzhen.c -------------------------------------------------------------------------------- /基于Linux系统下的CS聊天室程序/基于Linux系统下的CS聊天室程序.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/creategithubcc/C_Chat_Program/aebc85c604593c51a3e2f3f1d51e69e429c92e82/基于Linux系统下的CS聊天室程序/基于Linux系统下的CS聊天室程序.docx --------------------------------------------------------------------------------