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