/server/admin.c

https://github.com/panzhao/chatRoom · C · 273 lines · 177 code · 48 blank · 48 comment · 23 complexity · bab55566b63a8cae8ee7dfeb05108a3c MD5 · raw file

  1. /**************************************************************
  2. 文 件: admin.c
  3. 功 能: 管理员的功能
  4. 函数列表:
  5. ***************************************************************/
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <sys/socket.h>
  11. #include "server.h"
  12. #include "wrap.h"
  13. #include "debug.h"
  14. /**************************************************************
  15. 函 数: manage_speak
  16. 功 能: 管理用户是否能发言
  17. 传入参数: tran_msg:客户端法国来的数据包
  18. confd :服务器与客户端通信的端口
  19. 传出参数: 无
  20. 返 回: 0: 程序正确执行结果
  21. -1:程序错误执行结果
  22. **************************************************************/
  23. int manage_speak(struct chat *tran_msg, int confd)
  24. {
  25. int n_write;
  26. struct user_link *temp = NULL;
  27. /*找到用户并设置禁言*/
  28. temp = find_online(tran_msg->f_name);
  29. if (temp == NULL)
  30. {
  31. strcpy(tran_msg->m_name, "Server\n");
  32. strcpy(tran_msg->msg, "The people do not exist!\n");
  33. /*将用户信息写入网络端口*/
  34. n_write = Write(confd, tran_msg, sizeof(struct chat));
  35. if (n_write <= 0)
  36. {
  37. fputs("manage_speak:Write faliure\n", stderr);
  38. temp = find_by_confd(confd);
  39. delete_online(temp);
  40. notice(tran_msg->m_name, DOWNLINE);
  41. close(confd);
  42. return -1;
  43. }
  44. return 0;
  45. }
  46. debug_msg("admin:f_name %s", temp->user_msg.name);
  47. temp->speak_flag = 0;
  48. strcpy(tran_msg->m_name, "Server\n");
  49. strcpy(tran_msg->msg, "You have been forbideed speaking by administrator!\n");
  50. n_write = Write(temp->confd, tran_msg, sizeof(struct chat));
  51. if (n_write <= 0)
  52. {
  53. fputs("manage_speak:Write faliure\n", stderr);
  54. delete_online(temp);
  55. close(temp->confd);
  56. notice(tran_msg->m_name, DOWNLINE);
  57. return -1;
  58. }
  59. memset(tran_msg, 0, sizeof(struct chat));
  60. strcpy(tran_msg->m_name, "Server\n");
  61. strcpy(tran_msg->msg, "Set can't speak successful!\n");
  62. n_write = Write(confd, tran_msg, sizeof(struct chat));
  63. if (n_write <= 0)
  64. {
  65. temp = find_by_confd(confd);
  66. delete_online(temp);
  67. close(confd);
  68. notice(tran_msg->m_name, DOWNLINE);
  69. return -1;
  70. }
  71. return 0;
  72. }
  73. /******************************************************************
  74. 函 数: kick_one
  75. 功 能: 踢出某一个用户
  76. 传入参数: tran_msg:客户端发过来的数据
  77. confd :服务器和客户端的通信端口
  78. 传出参数: 无
  79. 返回值 : 0 :程序正确执行结果
  80. -1:程序错误执行结果
  81. ******************************************************************/
  82. int kick_one(struct chat *tran_msg, int confd)
  83. {
  84. int n_write;
  85. struct user_link *temp = NULL;
  86. temp = find_online(tran_msg->f_name); /*找到用户节点*/
  87. debug_msg("进入kick_one\n");
  88. /*判断需要操作的用户是否存在*/
  89. if (temp == NULL)
  90. {
  91. strcpy(tran_msg->m_name, "Server\n");
  92. strcpy(tran_msg->msg, "The people do not exist!\n");
  93. n_write = Write(confd, tran_msg, sizeof(struct chat));
  94. if (n_write <= 0)
  95. {
  96. fputs("kick_one:Write faliure\n", stderr);
  97. temp = find_by_confd(confd);
  98. delete_online(temp);
  99. close(confd);
  100. notice(tran_msg->m_name, DOWNLINE);
  101. return -1;
  102. }
  103. return 0;
  104. }
  105. if (strcmp(temp->user_msg.name, "admin\n") == 0)
  106. {
  107. strcpy(tran_msg->m_name, "Server\n");
  108. strcpy(tran_msg->msg, "The people you whant kick is administrtor, you can't kick yourself!\n");
  109. n_write = Write(confd, tran_msg, sizeof(struct chat));
  110. if (n_write <= 0)
  111. {
  112. fputs("kick_one:Write faliure\n", stderr);
  113. temp = find_by_confd(confd);
  114. delete_online(temp);
  115. close(confd);
  116. notice(tran_msg->m_name, DOWNLINE);
  117. return -1;
  118. }
  119. return 0;
  120. }
  121. strcpy(tran_msg->m_name, "Server\n");
  122. strcpy(tran_msg->msg, "You have been forbide to downline by administrator!\n");
  123. n_write = Write(temp->confd, tran_msg, sizeof(struct chat));
  124. if (n_write <= 0)
  125. {
  126. fputs("kick_one:Write faliure\n", stderr);
  127. temp = find_by_confd(temp->confd);
  128. delete_online(temp);
  129. close(temp->confd);
  130. notice(temp->user_msg.name, DOWNLINE);
  131. return -1;
  132. }
  133. close(temp->confd); /*关闭该用户的通信端口*/
  134. debug_msg("debug ,admin %d\n", temp->confd);
  135. memset(tran_msg, 0, sizeof(struct chat));
  136. strcpy(tran_msg->m_name, "Server\n");
  137. strcpy(tran_msg->msg, "Kick successful!\n");
  138. n_write = Write(confd, tran_msg, sizeof(struct chat));
  139. if (n_write <= 0)
  140. {
  141. temp = find_by_confd(confd);
  142. delete_online(temp);
  143. close(confd);
  144. notice(tran_msg->m_name, DOWNLINE);
  145. return -1;
  146. }
  147. return 0;
  148. }
  149. /******************************************************************
  150. 函 数: notice_online
  151. 功 能: 当有用户上线的时候通知各个在线用户有人上线
  152. 传入参数: tran_msg:用来传送信息的结构体
  153. 传出参数: 无
  154. 返 回: 0:程序正确执行结果
  155. -1:程序错误执行结果
  156. ******************************************************************/
  157. int notice(char *name, int choice)
  158. {
  159. struct user_link *temp = NULL; /*链表节点临时指针*/
  160. struct user_link *temp_online = NULL; /*在线链表查找临时指针*/
  161. /*传输消息缓存区*/
  162. struct chat tran_msg;
  163. memset(&tran_msg, 0, sizeof(struct chat));
  164. int n_write;
  165. /*用来存放编辑时候发送消息的内容*/
  166. char temp_msg[256];
  167. memset(temp_msg, 0, 256);
  168. /*将被操作的用户的名字减1后放入消息缓存区中*/
  169. strncpy(temp_msg, name, (strlen(name) - 1));
  170. debug_msg("len_name, %d\n", strlen(name) - 1);
  171. /*上线通知*/
  172. if (choice == ONLINE)
  173. {
  174. strcat(temp_msg, " online!\n");
  175. }
  176. /*下线通知*/
  177. if (choice == DOWNLINE)
  178. {
  179. strcat(temp_msg, " has downline!\n");
  180. }
  181. debug_msg("debug,notice_up name:%s, len:%d", temp_msg, strlen(temp_msg));
  182. memset(&tran_msg, 0, sizeof(struct chat));
  183. strcpy(tran_msg.m_name, "Server\n");
  184. strcpy(tran_msg.msg, temp_msg);
  185. /*循环将消息发送给客户*/
  186. for (temp = online_head; temp != NULL; temp = temp->next)
  187. {
  188. n_write = Write(temp->confd, &tran_msg, sizeof(struct chat));
  189. if (n_write <= 0)
  190. {
  191. fputs("notice_online: write faliure!", stderr);
  192. temp_online = find_by_confd(temp->confd);
  193. delete_online(temp_online);
  194. close(temp_online->confd);
  195. }
  196. }
  197. return 0;
  198. }
  199. /********************************************************************
  200. 函 数: notice_close_serv
  201. 功 能: 通知各个客户端服务器将要关闭的消息
  202. 传入参数: confd:客户端与服务器通信的端口
  203. 传出参数: 无
  204. 返 回: 0:程序正确执行结果
  205. -1:程序错误执行结果
  206. *********************************************************************/
  207. int notice_close_serv(int confd)
  208. {
  209. struct chat tran_msg;
  210. memset(&tran_msg, 0, sizeof(tran_msg));
  211. int n_write;
  212. struct user_link *temp = NULL;
  213. strcpy(tran_msg.m_name, "Server\n");
  214. strcpy(tran_msg.msg, "Server will be close after 10 seconds, Please downline as soon as possible!\n");
  215. for (temp = online_head; temp != NULL; temp = temp->next)
  216. {
  217. n_write = Write(temp->confd, &tran_msg, sizeof(tran_msg));
  218. if (n_write <= 0)
  219. {
  220. fputs("notice_close_serv:Write faliure!\n", stderr);
  221. close(temp->confd);
  222. }
  223. }
  224. return 0;
  225. }