資源簡介
1. 采用 Client/Server 架構
2. Client A 登陸聊天服務器前,需要注冊自己的 ID 和密碼
3. 注冊成功后,Client A 就可以通過自己的 ID 和密碼登陸聊天服務器
4. 多個 Client X 可以同時登陸聊天服務器之后,與其他用戶進行通訊聊天
5. Client A 成功登陸后可以查看當前聊天室內其他在線用戶 Client x
6. Client A 可以選擇發消息給某個特定的 Client X,即”悄悄話”功能
7. Client A 可以選擇發消息全部的在線用戶,即”群發消息”功能
8. Client A 在退出時需要保存聊天記錄
9. Server 端維護一個所有登陸用戶的聊天會的記錄文件,以便備查
1. Server 可以內建一個特殊權限的賬號 admin,用于管理聊天室
2. Admin 可以將某個 Client X “提出聊天室”
3. Admin 可以將某個 Client X ”設為只能旁聽,不能發言”
簡單完成版,后續還有新功能會添加!!!!!

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include??
#include?“headNode.h“
#include?
#include?
#define?OK?0
#define?SIZE?1024
#define?PORT?9999
typedef?struct?_msg
{
char?name[20];
char?passwd[20];
char?beiyong[20];
int?cmd;?
//int?sig;
}Msg;
Node*?head;
void?delete_user?(Msg?*msgint?client_socket);
void?kickout?(Msg?*msgint?client_socket);
int?callback(void*?pDataint?nCountchar**?pValuechar**?pName);
void*?shujuku(Msg?*msgint?sfd);
void?reg(Msg?*msg?int?sfd);
void?login(Msg?*msg?int?sfd);
void?sefriends(int?sfd);
void*?fasong(void*?v);//發送
void?pchat(Msg?*msgint?sfd);
void??quit(Msg*?msgint?sfd);
void*?Gfsong(void*?v);
void?gchat(int?sfd);
void?rsetpd(Msg?*msgint?sfd);
void*?handl_client(void*?v);
int?init_tcp();
int?myAccept(int?listen_fd);
void?silent(Msg?*msgint?client_socket);
void?silent_del?(Msg?*msg?int?client_socket);
void?delete_user?(Msg?*msgint?client_socket)
{
????printf?(“即將處理用戶注銷\n“);
????//?打開數據庫
????sqlite3?*database;
????int?ret?=?sqlite3_open(“user.db“?&database);
????if?(ret?!=?SQLITE_OK)
????{
????????printf?(“打開數據庫失敗\n“);
????????return;
????}
????//?刪除?user?表中的信息
????char?buf[100];
????char?*errmsg?=?NULL;
????sprintf?(buf?“delete?from?user?where?name=‘%s‘;“?msg->name);
????ret?=?sqlite3_exec(database?buf?NULL?NULL?&errmsg);
????if?(ret?!=?SQLITE_OK)
????{
????????printf?(“數據庫操作失敗:%s\n“?errmsg);
????????return;
????}
????//?關閉數據庫
????sqlite3_close(database);
????printf?(“刪除成功,已關閉數據庫\n“);
}
void?silent(Msg?*msgint?client_socket)
{
printf(“正在處理管理員?admin?對成員?%s?的禁言請求\n“msg->name);
sqlite3?*database?=?NULL;
int?ret?=?sqlite3_open(“user.db“&database);
if(ret?!=?SQLITE_OK)
{
printf(“打開數據庫失敗!\n“);
msg->cmd?=?-2;
write(client_socketmsgsizeof(Msg));
return;
}
char?*errmsg?=?NULL;
char?**resultp?=?NULL;
int?nrowncolumn;
char?*sql?=?“select?*?from?user“;
ret?=?sqlite3_get_table(databasesql&resultp&nrow&ncolumn&errmsg);
if(ret?!=?SQLITE_OK)
{
printf(“數據庫操作失敗!\n“);
msg->cmd?=?-1;
write(client_socketmsgsizeof(Msg));
return;
}
int?i;
for(i?=?ncolumn;i?(nrow+1)*ncolumn;i?+=?ncolumn)
{
if(strcmp(resultp[i]?msg->name)==0?&&?strcmp(resultp[i+4]?“1“)?==?0)
????????{???????????
????????????char?buf[100];
????????????errmsg?=?NULL;
????????????sprintf?(buf?“update?user?set?sig?=?1?where?name?=?‘%s‘“msg->name);
????????????ret?=?sqlite3_exec(database?buf?NULL?NULL?&errmsg);
????????????if?(ret?!=?SQLITE_OK)
????????????{
????????????????printf?(“數據庫操作失敗:%s\n“?errmsg);
????????????????return;
????????????}
????????????msg->cmd?=??9011;
????????????write?(atoi(resultp[i+3])?msg?sizeof(Msg));
????????????sqlite3_free_table(resultp);
????????????sqlite3_clo
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????17626??2018-09-20?09:19??7完成初版\1.server.c
?????文件??????21052??2018-09-18?21:54??7完成初版\client
?????文件??????24654??2018-09-18?21:53??7完成初版\client.c
?????文件???????3468??2018-09-16?19:25??7完成初版\headNode.c
?????文件????????889??2018-09-09?16:30??7完成初版\headNode.h
?????文件??????16982??2018-09-18?21:54??7完成初版\serve
?????文件??????16982??2018-09-17?21:15??7完成初版\server
?????文件???????3072??2018-09-18?21:57??7完成初版\user.db
?????文件???????2048??2018-09-18?21:55??7完成初版\xinxi.db
?????目錄??????????0??2018-09-25?15:47??7完成初版
-----------?---------??----------?-----??----
???????????????106773????????????????????10
- 上一篇:R語言課程論文
- 下一篇:華工操作系統復習資料
評論
共有 條評論