




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、文檔編碼 : CC5H5M5S2G10 HN7K5T1B2W9 ZN3V4N5U2G1網(wǎng)絡編程 課程設計說明書題目名稱:基于 TCP/IP 的網(wǎng)絡文字談天程序設計專 業(yè):網(wǎng)絡工程班 級:1201 班學 號:1220220225 姓 名:蔣星指導老師:陳利平完成日期:2022 年 12 月 13 日目錄一、試驗基本信息概要313151. 題目要求32. 題目內(nèi)容33. 開發(fā)環(huán)境3二、流程圖4三、系統(tǒng)簡介51. 界面52. 軟件功能53. 系統(tǒng)設計94. 優(yōu)點與缺點9四、系統(tǒng)具體設計111. ChatServer類 112. ChatClient 類3. SocketException類5. 命令
2、協(xié)議156. 消息格式16五、 系統(tǒng)測試161. 服務器使用錯誤162. 客戶端使用錯誤173. 啟動服務器174. 啟動客戶端175. 關(guān)閉客戶端176. 啟動服務器錯誤提示187. 公開談天188. 私聊 189. 錯誤的私聊 1910. 更名 2011. 幫忙 2012. 非法指令 2013. 非法的指令參數(shù) 2014. 連接服務器失敗 21六、心得體會 21七、完整代碼 21Charserverd.cpp 服務器 main 函數(shù)文件 21ChatServer.h 服務器類頭文件 22ChatServer.cpp 服務器類 23ClientInfo .h 客戶信息類 33Charclie
3、ntd.cpp 客戶端 main 函數(shù) 34ChatClient .h 客戶端頭文件 34ChatClient .cpp 客戶端類 35InitSock .cpp 初始化 WINSOCK 類 41SockException .h 反常類 41八、 參考文獻 42一、 試驗基本信息概要 1. 題目要求 1、開發(fā)平臺; 2Visual C+ 6.0、對設計方法的要求 3使用 Visual C+ 6.0 開發(fā)出在 Windows把握臺或圖形界面下運行的程序;、對設計內(nèi)容的要求 實現(xiàn)網(wǎng)絡文字談天程序的服務器端; 實現(xiàn)網(wǎng)絡文字談天程序的客戶端;主程序的結(jié)構(gòu)和流程; 程序運行過程的截圖; 網(wǎng)絡文字談天程序
4、的實現(xiàn)原理; 網(wǎng)絡文字談天程序?qū)崿F(xiàn)代碼的分析; 4、對課程設計說明書的要求 設計思路與開發(fā)過程; 對主要代碼段要有較具體的注釋; 對本次設計的評判、設計的收成與建議; 5、說明書為打印件2. 題目內(nèi)容內(nèi)容概要: 實現(xiàn)網(wǎng)絡文字談天程序的基本功能;3. 開發(fā)環(huán)境操作系統(tǒng): Windows 7 開發(fā)語言: C+ 集成開發(fā)環(huán)境:Microsoft Visual Studio 2022 二、流程圖三、系統(tǒng)簡介 1. 界面 本軟件使用 DOS 把握臺界面,界面風格較為淳樸;服務器:客戶端:2. 軟件功能 本軟件實現(xiàn)了談天室基本的功能,包括公開談天,私聊,獵取在線用戶,更換昵稱,獲 得幫忙等;1)公開談天
5、在光標處直接輸入消息后按回車即為發(fā)送公開談天,如下圖所示;2)私聊使用命令【/m 對方 UID 消息】即可發(fā)送私聊,私聊只有對方可以看到,如下圖所示:客戶端 1,密聊 UID 為 132 的用戶;發(fā)送后客戶端 2,UID 為 132 的用戶收到私聊消息;3)獵取在線用戶列表使用命令 【/list】即可獲得在線用戶列表,用戶列表會議系統(tǒng)消息的方式返回,如下圖所示;命令發(fā)送后4)更換昵稱使用命令【 /name 你的新昵稱】即可立刻更換昵稱,勝利修改后服務器會以系統(tǒng)消息的方式返回勝利修改的提示;命令命令發(fā)送后5)幫忙信息使用命令【 /help】即可查看服務器的歡迎信息,里面包含了該談天室的使用幫忙,
6、如下圖所示;命令命令發(fā)送后3. 系統(tǒng)設計開發(fā)本軟件時, 我使用了面對對象的思想,把服務器和客戶端封裝成對應的類,類設計將會在下一節(jié)做具體介紹;通行方面我在服務器接受客戶端消息,和客戶端接受服務器消息時使用了 select 模型, 發(fā)送信息我使用的是一般的socket 原語; 基本原理為服務器與客戶端建立 TCP 連接,然后服務器負責路由消息到各個客戶端;4. 優(yōu)點與缺點本軟件對流程復雜的 SELECT 模型進行了細致的拆分與抽象,做到了規(guī)律流程清楚,每個函數(shù)簡潔易懂,層次分明;例如服務器啟動函數(shù):void ChatServer:Start InitListenSocket; Bind; Lis
7、ten; InitFDSocket; while true DoSelect; try charServer.Start; catchSockException e cout e.GetErrorInfo endl; cout System Error Error Code: e.GetErrorCode 0 forint i = 0;i m_fdRead.fd_count; i+ DoFDReadm_fdRead.fd_arrayi; 它也只完成一個簡潔的流程,調(diào)用select,然后循環(huán)處理有讀大事的socket;void ChatServer:DoRead SOCKET sRead if
8、sRead = m_sListen RecvNewConnect; else m_sNowClient = sRead; RecvNewConnect; 接下來的DoFDRead ()函數(shù)完成的事情也特別直接,假如有大事的socket 是監(jiān)聽socket的話,那么就是接收到了一個新的連接,否就是接收到了新的小;從上面這個簡潔的例子中可以看到,本軟件最大的優(yōu)點就是細心設計的類和函數(shù);防止了使用 select 模型常見的反復嵌套的循環(huán)和判定,每個函數(shù)清楚明白;本系統(tǒng)仍存在以下不足,第一是沒有對界面做更深化的優(yōu)化,只是做了最基本的調(diào)整,讓輸入輸出更加雅觀,其次是底層原語的封裝并沒有考慮到泛用性;四、
9、系統(tǒng)具體設計這部分的文檔在編碼之前已經(jīng)基本完成,1. ChatServer 類 該類負責完成服務器全部操作;1) 類圖 2 成員變量由于時間較為倉促, 部分內(nèi)容可能和實際有所出入;Map m_clients 談天者的 SOCKET 與昵稱的映射 fd_set m_fdSocket 可用套接字集合 fd_set m_fdRead 有大事發(fā)生的套接字集合 SOCKET m_sListen 監(jiān)聽 Socket SOCKET m_sNowClient 當前處理的客戶套接字 int m_nPort 監(jiān)聽端口3 方法設計void Bind void Listen void Select int Recv
10、SOCKET Accept 封裝底層原語,并加入反常機制,使得外部調(diào)用簡約明白;構(gòu)造函數(shù) m_nPort 傳入監(jiān)聽端口,初始化Start 1)初始化監(jiān)聽套接字:void InitListenSocket 2)綁定套接字至本地機器:void Bind 3)進入監(jiān)聽模式(設置為非堵塞):void Listen 4)初始化可用套接字集合 void InitFDSocket 5)死循環(huán),調(diào)用 select 方法 DoSelect 6)終止DoSelect 1)令 m_fdRead = m_fdSocket 2)調(diào)用 Select 3)循環(huán)處理Select 的結(jié)果DoFdReadSocket sRead
11、 4)終止DoFdReadint iReadIndex 1)判定是否為 m_sListen 2)是 m_sListen RecvNewConnect 3)否就 令 m_sNowClient = m_fdReadiReadIndex,調(diào)用 RecvNewMessage RecvNewConnect 1)判定是否達到套接字上線2)調(diào)用 Accept ,接收連接 sClient 3)添加 sCilent 至 m_fdSocket 4)添加套接字至 m_clients AddClientToInfoMapstring name AddClientToInfoMapstring name 1)以 SOK
12、CET 為鍵, name 為值加入 MAPRecvNewMessage 1)調(diào)用 Recv 函數(shù)2)是否為命令 IsCommandstring str 3)是,就 DoCommandstring cmd 4)否,就 DoMessagestring msg 5)終止IsCommandstring str 1)判定是否以 / 開頭DoCommandstring cmd 1)判定指令,并解析命令與參數(shù)(argc, argv)2)調(diào)用指令處理函數(shù) 3)假設只有 SetName 命令,那么就將對應的套接字的名稱設置 DoMessagestring msg BuildMsgstring msg 1)拼接消
13、息與名字 2)在服務器上輸出 3)消息路由 DispatchMessagestring msg BuildMsgstring msg 1)從 m_clients 中取出用戶昵稱 2)拼接字符串,形成格式如下 超人君 127.0.0.1 23:49:48 說: 大家好 . 即為:昵稱( IP 地址)時間 說:消息正文 3)返回 DispatchMessagestring msg 1)構(gòu)造迭代器2) 遍歷 m_clients, 如不是自身,就派送消息 Send 2. ChatClient 類該類負責處理客戶端的全部操作;1) 類圖 2) 字段設計SOCKET m_sClient客戶端自身的sock
14、et SOCKET m_sServer服務器 socket string m_name昵稱服務器地址sockaddr_in m_ServerAddr;3) 方法設計構(gòu)造函數(shù) 依據(jù)端口號和服務器 IP 初始化 m_server Connect void Select int Recv void Send int Select 封裝底層原語,加入反常處理,使得外部調(diào)用節(jié)省文雅void Start 1)初始化套接字 InitClientSocket 2)連接服務器 Connect 設置為非堵塞模式 3)獵取名字并發(fā)送至服務器 InitName 4)創(chuàng)建新線程并顯示替他用戶發(fā)言 5)循環(huán) SendMs
15、g 6)關(guān)閉客戶端 CloseClient InitName 1)提示輸入昵稱 2)獵取昵稱 3)合法性判定 判定重復 4)添加命令格式 5)發(fā)送至服務器SendMsg 1)讀取一行消息線程函數(shù) RecvMsgThread 2)判定是否為命令 IsCommandstring str 3)命令:處理命令 DoCommandstring cmd 4)消息:處理消息 DoMessagestring msg DoMessagestring msg 1)發(fā)送消息 Send 2)本地回顯RecvMsgThread 1) 初始化 fdSocket, 將 m_sClient 加入 2)創(chuàng)建 fdRead 3)
16、死循環(huán) ,將 m_sClient 拷貝至 fdRead 4)調(diào)用 Select 5)循環(huán),并輸出收到的消息 Recv 3. SocketException 類該類負責記錄 SOKCET 錯誤的代碼以及錯誤信息;5. 命令協(xié)議命令格式為 /命令 參數(shù) 1 參數(shù) 2 1. 退出 : /exit 2. 獵取在線用戶列表:/getuser 3. 私聊:/m UID 信息 4. 清屏: /clear 5. 幫忙: /help 處理方式IsCommandstring str 負責解析是否為命令如是命令將命令解析為argc,argv 判定首字母是否為斜杠/ str.at0 = / ResoveCommand
17、string cmd, int& argc, string argvDoCommandstring cmd 處理命令,調(diào)用具體的XXX 命令處理函數(shù)DoCmdXXXX;6. 消息格式1) 公共消息 超人君 127.0.0.1 UID:100 說: 大家好 . 李四 127.0.0.1 UID:101 說:你好!2) 私聊 你靜靜地對 ABC UID :100 說:你好 CDF UID:101 靜靜地對你說:你好3) 服務器消息【系統(tǒng)消息】 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;4) 程序內(nèi)部提示 System Infoxxxxxxxxxxxxxxxxxxxxxxxxx五
18、、系統(tǒng)測試1. 服務器使用錯誤2. 客戶端使用錯誤3. 啟動服務器4. 啟動客戶端 客戶端顯現(xiàn)歡迎信息以及昵稱輸入提示;服務器顯現(xiàn)連接提示5. 關(guān)閉客戶端 服務器顯現(xiàn)斷開連接提示6. 啟動服務器錯誤提示 給出錯誤提示信息和提示代碼7. 公開談天 全部客戶端以及服務器都會顯示;8. 私聊 只有私聊的二人才能看到談天信息,其他用戶和服務器無法看到;9. 錯誤的私聊 私聊自己會得到一個錯誤提示私聊不存在的用戶也會得到一個錯誤提示10. 更名11. 幫忙12. 非法指令非法指令會給出錯誤提示;13. 非法的指令參數(shù)14. 連接服務器失敗六、心得體會這次實現(xiàn)我深化爭辯了 select 模型的使用,完成了
19、一個簡易的談天室;這次試驗也使我在編 程技巧方面也有了很大的提高;七、完整代碼Charserverd.cpp 服務器 main 函數(shù)文件#include ChatServer.h #include SockException.h #include InitSock.h #include using namespace std; InitSock initSock; int mainint argc, char* argv if argc 2 cout Usage: argv0 Port endl; return 1; ChatServer charServeratoiargv1; try ch
20、arServer.Start; catch SockException& e cout e.GetErrorInfo endl; cout System ErrorError Code: e.GetErrorCode endl; ChatServer.h 服務器類頭文件#ifndef CHAT_SERVER_H #define CHAT_SERVER_H #include #include #include #include ClientInfo.h using namespace std; class ChatServer public: void Start; void End; Chat
21、Serverint nPort; ChatServervoid; private: void InitFDSocket; void DoSelect; void DoFDReadSOCKET sRead; void RecvNewConnect; string IPAddrToStringsockaddr_in sin; void AddClientToInfoMapClientInfo info; void RecvNewMessage; bool IsCommandstring str; void DoCommandstring cmd; void ResoveCommandstring
22、cmd, int& argc, string argv; void DoCmdNameint argc, string argv; void DoCmdGetUsersint argc, string argv; void DoMessagestring msg; void DoCmdPrivateMsgint argc, string argv; string BuildMessagestring str, bool bIsPublic; string BuildSystemMsgstring str; void DispatchMessagestring msg; void CloseCo
23、nnect; string IntToStringint nNum; /= 簡潔封裝底層原語 = void InitListenSocket; void Bind; void Listen ; int Select; int Recvchar msgBuff; void Sendstring msg, SOCKET client; SOCKET Acceptsockaddr_in& sin; /= private: map m_clients; fd_set m_fdSocket; fd_set m_fdRead; SOCKET m_sListen; SOCKET m_sNowClient;
24、int m_nPort; ; #endif CHAT_SERVER_H ChatServer.cpp 服務器類#include #include #include ChatServer.h #include SockException.h #pragma commentlib, ws2_32.lib using namespace std; #define MAX_BUFF_SIZE 500 typedef map:iterator map_it; ChatServer:ChatServerint nPort this-m_nPort = nPort; void ChatServer:Star
25、t InitListenSocket; Bind; Listen; InitFDSocket; while true DoSelect; void ChatServer:DoSelect m_fdRead = m_fdSocket; int nRet = Select; if nRet 0 for int i = 0; i = FD_SETSIZE cout System Info接受連接達到上限,拒絕連接 endl; return; sockaddr_in clientAddr; m_sNowClient = AcceptclientAddr; ClientInfo clientInfocl
26、ientAddr; cout System Info接受來自 clientInfo.GetIp 的連接 endl; FD_SETm_sNowClient, &m_fdSocket; AddClientToInfoMapclientInfo; string ChatServer:IPAddrToStringsockaddr_in sin string str = inet_ntoasin.sin_addr; str.append:; char szFormat20; str.appendltoa ntohssin.sin_port,szFormat,10; return str; void Ch
27、atServer:AddClientToInfoMapClientInfo info m_clientsm_sNowClient = info; void ChatServer:RecvNewMessage char msgBuffMAX_BUFF_SIZE; int nRet = RecvmsgBuff; string msgmsgBuff; if nRet = 0 return; if IsCommandmsg DoCommandmsg; else DoMessagemsg; void ChatServer:DoCommandstring cmd int argc; string argv
28、100; ResoveCommandcmd, argc, argv; if argv0 = name DoCmdNameargc, argv; else if argv0 = list DoCmdGetUsersargc, argv; else ifargv0 = m DoCmdPrivateMsgargc, argv; else Send【系統(tǒng)消息】 命令不存在, 請使用/help 命令查看命令幫忙, m_sNowClient; void ChatServer:ResoveCommandstring cmd, int& argc, string argv int count = 0; for
29、int i = 1; i second.GetName + + begin-second.GetIp; msg.append UID: + IntToStringintbegin-first; msg.appendnr; Sendmsg, m_sNowClient; void ChatServer:DoCmdNameint argc, string argv if argc .= 2 Send 【系統(tǒng)消息】命令格式錯誤 USAGE: /name 你的昵稱 , m_sNowClient; return; string name = argv1; m_clientsm_sNowClient.Set
30、Namename; Send 【系統(tǒng)消息】昵稱已修改為 : + name, m_sNowClient; void ChatServer:DoMessagestring str string msg = BuildMessagestr, true; cout msg endl; DispatchMessagemsg; /* string ChatServer:BuildMssagestring str ClientInfo info = m_clientsm_sNowClient; string name = info.GetName; string ip = info.GetIp; strin
31、g msg = name; if name .= ip msg.append + ip + ; char buff10; string iditoaintm_sNowClient, buff, 10; msg.append UID: + id; msg.append 說: ; msg.appendnr ; msg.appendstr; return msg; */ string ChatServer:BuildSystemMsgstring str string msg【系統(tǒng)消息】 ; msg.appendstr; return msg; string ChatServer:BuildMess
32、agestring str, bool bIsPublic ClientInfo info = m_clientsm_sNowClient; string name = info.GetName; string ip = info.GetIp; string uid = IntToStringintm_sNowClient; string msgname; if ip .= name & bIsPublic = true msg.append + ip + ; msg.append ; msg.appendUID: + uid; msg.append ; bIsPublic . msg.app
33、end說: : msg.append 靜靜地對你說:; msg.appendnr; msg.append ; msg.appendstr; return msg; void ChatServer:DoCmdPrivateMsgint argc, string argv if argc first = m_sNowClient Send 【系統(tǒng)消息】您不能和自己私聊 , m_sNowClient; return; string name = it-second.GetName; string uid = IntToStrings; string toDest = BuildMessage, fa
34、lse; string toSrc = string你靜靜地對 + name + UID: + uid + 說:nr ; string other; for int i = 2; i first; bool ChatServer:IsCommandstring str if str.at0 = / return true; else return false; void ChatServer:CloseConnect cout System Info來自 m_clientsm_sNowClient.GetIp 的連接已斷開 endl; closesocketm_sNowClient; FD_C
35、LRm_sNowClient,&m_fdSocket; void ChatServer:InitFDSocket FD_ZERO&m_fdSocket; FD_SETm_sListen, &m_fdSocket; void ChatServer:InitListenSocket m_sListen = socketAF_INET, SOCK_STREAM, IPPROTO_TCP; if m_sListen = INVALID_SOCKET throw SockExceptionSystem Error創(chuàng)建套接字失敗:; void ChatServer:Bind sockaddr_in sin
36、; sin.sin_family = AF_INET; sin.sin_addr.S_un.S_addr = INADDR_ANY; sin.sin_port = htonsm_nPort; if bindm_sListen, sockaddr*&sin, sizeofsin = SOCKET_ERROR throw SockExceptionSystem Error 無法綁定端口 ; else void ChatServer:Listen if listenm_sListen, 10 = SOCKET_ERROR throw SockExceptionSystem Error服務器監(jiān)聽端口失
37、敗; else cout System Info 服務器在 m_nPort 端口開頭監(jiān)聽 endl; u_long value = 1; if ioctlsocketm_sListen, FIONBIO, &value throw SockExceptionSystem Error設置服務器為非堵塞模式失敗; int ChatServer:Select int nRet = select0, &m_fdRead, NULL, NULL, NULL; if nRet = SOCKET_ERROR throw SockExceptionSystem Error 調(diào)用 SELECT 原語失敗 ; e
38、lse return nRet; SOCKET ChatServer:Acceptsockaddr_in& sin int nLen = sizeofsin; SOCKET sNew = acceptm_sListen, sockaddr*&sin, &nLen; if sNew = INVALID_SOCKET throw SockExceptionSystem Error調(diào)用 ACCEPT 原語接受連接失敗; return sNew; int ChatServer:Recvchar msgBuff int nRet = recvm_sNowClient, msgBuff, MAX_BUFF
39、_SIZE, 0; if nRet = SOCKET_ERROR CloseConnect; return 0; else msgBuffnRet = 0; return nRet; void ChatServer:Sendstring msg, SOCKET client if sendclient, msg.c_str, msg.size, 0 = SOCKET_ERROR string errorIp = m_clientsclient.GetIp; throw SockExceptionSystem Error發(fā)送信息 + msg + 至 + errorIp + 失敗 ; string
40、 ChatServer:IntToStringint nNum char buff10; string stritoanNum, buff, 10; return str; ChatServer:ChatServervoid ClientInfo.h 客戶信息類#include using namespace std; class ClientInfo public: ClientInfo ClientInfostring ip, int port, string name this-ip = ip; this-port = port; this-name = name; ClientInfo
41、sockaddr_in sin ip = inet_ntoasin.sin_addr; /port = ntohssin.sin_port; name = ip; /name.append:; /char szFormat20; /name.appendltoa ntohssin.sin_port,szFormat,10; string GetIp return ip; string GetName return name; int GetPort return port; void SetNamestring name this-name = name; private: string na
42、me; string ip; int port; ; Charclientd.cpp 客戶端 main 函數(shù)#include SockException.h #include InitSock.h #include #include ChatClient.h using namespace std; InitSock initSock; int mainint argc, char* argv try if argc 3 cout Usage: argv0 Ip Port endl; return 1; ChatClient clientargv1,atoiargv2; client.Star
43、t; catch SockException& e cout e.GetErrorInfo endl; cout System ErrorError Code: e.GetErrorCode endl; ChatClient.h 客戶端頭文件#ifndef CHAT_CLIENT_H #define CHAT_CLIENT_H #include #include using namespace std; class ChatClient public: ChatClientstring addr, int nPort; ChatClientvoid; void Start; void End;
44、 SOCKET GetClientSock; private: void Connect; int Recv; void Sendstring msg; int Select; void InitClientSocket; string IPAddrToStringsockaddr_in sin; void Welcome; void SendMsg; void InitName; bool IsCommandstring str; void DoMessagestring msg; void DoCommandstring cmd; void ResoveCommandstring cmd,
45、 int& argc, string argv; string GetLine; private: string m_name; SOCKET m_sClient; SOCKET m_sServer; sockaddr_in m_serverAddr; ; #endif CHAT_CLIENT_H ChatClient.cpp 客戶端類#include #include #include #include #include ChatClient.h #include SockException.h #pragma commentlib, ws2_32.lib #define MAX_BUFF_
46、SIZE 500 using namespace std; void RecvMsgThreadvoid * param; ChatClient:ChatClientstring addr, int nPort m_serverAddr.sin_addr.S_un.S_addr = inet_addraddr.c_str; m_serverAddr.sin_port = htonsnPort; m_serverAddr.sin_family = AF_INET; ChatClient:ChatClientvoid void ChatClient:Start InitClientSocket;
47、Connect; Welcome; Sleep1000; InitName; _beginthreadRecvMsgThread,NULL,void*this; while true SendMsg; void ChatClient:Welcome cout = endl; cout *歡迎使用簡易談天室* endl; cout 操作指南: 1)在把握臺中直接輸入后,按回車即可發(fā)送公共談天消息 endl; cout 2)以斜杠(/)開頭的消息將會當做命令處理 endl; cout endl; cout 命令指南:1退出USAGE: /exit endl; cout 2獵取在線用戶USAGE:
48、/list endl; cout 3更換昵稱USAGE: /name 你的昵稱 endl; cout 4私聊USAGE: /m 對方 UID 消息 endl; cout 5幫忙信息USAGE: /help endl; cout = endl; void ChatClient:InitName string name; cout 請輸入昵稱 :; name = GetLine; Send/name + name; void ChatClient:SendMsg string msg; msg = GetLine; if msg = return; if IsCommandmsg DoComman
49、dmsg; else DoMessagemsg; string ChatClient:GetLine string input; getlinecin, input; HANDLE hOut = GetStdHandleSTD_OUTPUT_HANDLE; CONSOLE_SCREEN_BUFFER_INFO bInfo; GetConsoleScreenBufferInfohOut, &bInfo; COORD pos; pos.X = bInfo.dwCursorPosition.X; pos.Y = bInfo.dwCursorPosition.Y - 1; FillConsoleOut
50、putCharacterhOut, , input.size, pos, NULL; SetConsoleCursorPositionhOut, pos; return input; void ChatClient:DoCommandstring cmd int argc; string argv100; ResoveCommandcmd, argc, argv; if argv0 = exit /systemexit; else if argv0 = help Welcome; else DoMessagecmd; void ChatClient:DoMessagestring msg /TODO Sendmsg; void ChatClient:ResoveCommandstring cmd, int& argc, string argv int count = 0; forint i = 1; i cmd.size; i+ char c = cmd.ati; if c .= argvcount += c; else count +; argc = +count; bool ChatClient:IsCommandstring str if str.at0 = / return true; else return false; void ChatCl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消保知識培訓內(nèi)容課件
- 2025湖南邵陽市隆回縣公開招聘高中職業(yè)中專教師40人考前自測高頻考點模擬試題及一套答案詳解
- 安全培訓行業(yè)發(fā)展前景
- 2025年杭州市臨安區(qū)中醫(yī)院醫(yī)共體招聘合同制員工11人模擬試卷及參考答案詳解
- 2025年金華義烏市中心醫(yī)院招聘護理全日制本科崗位10人考前自測高頻考點模擬試題(含答案詳解)
- 2025屆春季特區(qū)建工集團校園招聘正式啟動考前自測高頻考點模擬試題完整參考答案詳解
- 安全培訓范興臣課件
- 2025年黃山市祁門文化旅游發(fā)展集團有限公司招聘5人模擬試卷及答案詳解(考點梳理)
- 2025海南軟件職業(yè)技術(shù)學院考核招聘事業(yè)編制專任教師15人考前自測高頻考點模擬試題及完整答案詳解
- 2025河南商丘市實達國際人力資源合作有限公司招聘輔助人員30人模擬試卷及1套參考答案詳解
- 2024-2030年中國船舶設計行業(yè)需求態(tài)勢展望及發(fā)展戰(zhàn)略分析報告
- 乒乓球培訓機構(gòu)教學管理制度
- 《非洲民間故事》整本書閱讀 課件 五年級上冊語文(統(tǒng)編版) 五年級上冊語文整本書閱讀 導讀課件+講義+閱讀檢測(統(tǒng)編版)
- 河南省青桐鳴大聯(lián)考2024-2025學年高一上學期10月月考政治試題含答案
- DB35-T 1857-2019 茶莊園建設指南
- 初中英語單詞全集(打印版)
- 2024年鑫源汽車有限公司招聘筆試沖刺題(帶答案解析)
- 山東旅游宣傳有內(nèi)容課件
- 高等學校英語應用能力B級講解省公開課一等獎全國示范課微課金獎課件
- DB11T 489-2024 建筑基坑支護技術(shù)規(guī)程
- 高中社會實踐心得體會800字6篇
評論
0/150
提交評論