抢答器改写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即可,因为一个客户端只需要一个通信套接字即可.

 

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