具備注冊賬號,群聊,查看在線人員信息,私發文件和接收文件功能,因為每個客戶端只有一個屬於自己的socket,所以無論客戶端是發聊天消息還是文件都是通過這一個socket發送,
這也意味着服務器收發任何消息或文件都只能有一個select函數也意味着只能有一個收發消息的線程。
所以我定義了一個通用結構體:
struct snd{
char msg[30]; //消息性質,同時也是普通聊天消息..
int soc; //套接字
int count; //用戶賬號
char filename[20]; //文件發送時的文件名
int size; //文件大小
char buffer[1024]; //每次fread讀取文件時的大小
};
第一個字符串msg時用來保存消息的性質,是聊天消息 還是文件發送消息 還是菜單命令消息,我的處理方法有點"偷懶",應該是有點蠢..
因為文件發送時msg保存的字符串就是"FILE",服務器只要判斷它的字符串是"FILE"就認為它時文件消息並把它轉發給指定客戶端。
而msg[30]在結構體是聊天消息的情況下保存的就是聊天的消息,如果msg不是我指定的字符串的話服務器就會把它當聊天消息轉發,所以如果我在聊天室輸入"FILE"並發送…你懂的,BUG就出現了。
。
收發文件我是在服務器收發線程中加入文件收發的函數,判斷收到的是文件就跳入此函數,所以可能會出現兩個客戶端發送接收文件時其他客戶端群聊消息接收有延遲,不過我沒測試過….
瑕疵很多,還有很多需要改進的地方,望各位前輩海涵。
上代碼:
服務器↓
客戶端↓