搶答器改寫TCP版總結,及和UDP版的比較

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即可,因爲一個客戶端只需要一個通信套接字即可.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章