TCP和UDP的區別:
消息結構:UDP首先定義好每一條協議的每一字節的內容,由第一字節的號碼來確定受到的小時是什麼內容,然後根據預定好的結構來提取數據.而TCP會首先定義一個消息類CMessage,類中可以含CSTRING的變長類,可以變動大小.
發送數據:UDP用SendTo來發送消息,而TCP不會直接用Send,而是用pMsg->Serialize(*m_pArchiveOut)來發送消息.
接受數據:UDP通過socket的OnReveive()中用Receive()來把消息接收到一個字符數組,然後用Doc::ProcessPendingRead(char *lbuff)來處理數據,TCP中在OnReveive()中直接調用m_pDoc->ProcessPendingRead()在ProcessPendingRead中調用ReadMsg()來把消息讀取到一個消息對象中,然後對消息對象的數據進行處理
服務器發送消息:UDP不用記錄客戶端的信息,採用SendTo的廣播發送方式,局域網內都可以受到,而TCP用一個指針鏈表記錄各個客戶斷的通信套接字指針,發送消息時,循環對鏈表中的每個套接字指針發送一次消息即可.
BUG:發送最終結果,讀取文件錯誤
原因:由於ID號都初始化爲0,當發送的號碼或者分數有0時就會發生錯誤,出現-52,這是在UDP中沒有發生過的,所以,發送時,ID號都初始化爲99,就沒有上述問題發生了.
在對 一未命名文件 進行訪問時發生了一個不明錯誤
============================================================================================
TCP首發數據一般不用 SEND RECV,而是直接用serialize(ar)
1.CMessage
2.創建CLISTENSOCKET監聽套接字
3.客戶端和服務器端的數據套接字
=====================================================================================================
客戶端:
Doc::SendMsg()---msg.Serialize(*m_pArchiveOut);
m_pArchiveOut->Flush();
Doc::ReceiveMsg()---msg.Serialize(*m_pArchiveIn);
-----------------------------------------------------------------------------------------------------
服務器端:
Doc::SendMsg(pSocket ,pmsg ) ---C***Socket::SendMsg(pmsg): pMsg->Serialize(*m_pArchiveOut);
m_pArchiveOut->Flush();
CMessage* Doc::ReadMsg( pSocket) --- C***Socket::ReceiveMsg(*pMsg):pMsg->Serialize(*m_pArchiveIn);
==================================================================================
服務器端:
監聽套接字只需要關聯DOC,並重載OnAccept()函數. 而通信套接字要關聯CMessage和Doc類,而且要有初始化函數,使得創建通信套接字後能夠關聯CSocketFile和CArchive,從而初始化後就能夠開始通信,此外,通信套接字類還要有 SendMSG(pMsg)和RecvMsg(pMsg)函數,使得能夠收發數據.
當某一客戶端推出後,應該關閉套接字close(對應create),刪除鏈表元素removeAt(對應addtail),刪除套接字指針delete(對應new).
客戶端只有通信套接字,只需關聯DOC和重載OnReceive即可,因爲一個客戶端只需要一個通信套接字即可.