freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于tcp的網(wǎng)絡(luò)通信協(xié)議設(shè)計畢業(yè)論文-預(yù)覽頁

2025-06-20 18:09 上一頁面

下一頁面
 

【正文】 做,時序表示做的順序。用戶從OSI網(wǎng)絡(luò)模型可以很直觀地看到,網(wǎng)絡(luò)數(shù)據(jù)從發(fā)送方到達(dá)接收方的過程中,數(shù)據(jù)的流向以及經(jīng)過的通信層和相應(yīng)的通信協(xié)議。在OSI七層網(wǎng)絡(luò)模型中,各個網(wǎng)絡(luò)層都具有各自的功能,如表所示。3. 4 TCP/IP協(xié)議 tcp/ip協(xié)議簡介TCP/IP協(xié)議實際上是一個協(xié)議簇,其包括了很多協(xié)議。其具有重發(fā)機制,即當(dāng)數(shù)據(jù)被破壞或者丟失時,發(fā)送方將重發(fā)該數(shù)據(jù)。 TCP傳輸TCP,Transfer Control Protocol的縮寫(傳輸控制協(xié)議),是一種面向連接的網(wǎng)絡(luò)傳輸協(xié)議。C/S計算技術(shù)在信息產(chǎn)業(yè)當(dāng)中占有重要的地位。服務(wù)器接受網(wǎng)絡(luò)上的請求,完成服務(wù)后將結(jié)果返回給申請者。而那些用于訪問服務(wù)器資料的計算機則被叫做客戶機。C/S編程模型是基于可靠連接的通信模型。服務(wù)器端等待客戶端連接請求的到來,這個過程稱為監(jiān)聽過程。C/S編程模型如圖所示: C/S編程模型   由于客戶端連接服務(wù)器時,需要使用服務(wù)器的IP地址和監(jiān)聽端口號才能完成連接。注意:用戶在實際編程中,通信雙方的連接以及數(shù)據(jù)通信均是基于Socket(套接字)進行的。通常,套接字主要有兩種類型,分別是流式套接字(SOCK_STREAM)和數(shù)據(jù)報套接字(SOCK_DGRAM)。例如,當(dāng)數(shù)據(jù)0x358457使用網(wǎng)絡(luò)字節(jié)順序進行存儲時,該值在內(nèi)存中的存放順序?qū)⑹?x30x80x57。在本節(jié)中,將向用戶介紹兩個主要的套接字相關(guān)類,分別是CAsyncSocket類和CSocket類。如果請求到來,則調(diào)用函數(shù)Accept()響應(yīng)該請求。注意:在MFC中,所有類中均有一個變量m_hWnd表示該類的實例句柄。用戶在實際編程中,通過將CSocket類與CSocketFile類和CArchive類一起使用,能夠很好地管理數(shù)據(jù)以及發(fā)送數(shù)據(jù)。如果創(chuàng)建客戶端套接字,則直接調(diào)用函數(shù)Connect()連接服務(wù)器即可。(6)關(guān)閉或銷毀CSocket類、CSocketFile類和CArchive類的3個對象。同樣調(diào)用StreamReader 類的Readlin ( )方法讀取網(wǎng)絡(luò)緩沖區(qū)中數(shù)據(jù),不管是否讀到數(shù)據(jù)都立即返回,而不會一直掛在此函數(shù)調(diào)用上。每個進程包含一到多個線程。所以線程基本上是輕量級的進程,它負(fù)責(zé)在單個程序里執(zhí)行多任務(wù)。 (1)當(dāng)前沒有進行處理的任務(wù)可以將處理器時間讓給其他任務(wù)。在以下情況下,最適合采用多線程處理: (6)耗時或大量占用處理器的任務(wù)阻塞用戶界面操作。(3)線程可能會給程序帶來更多“bug”,因此要小心使用。當(dāng)兩個或多個線程之間同時等待對方釋放資源的時候就會形成線程之間的死鎖。然而這些聊天工具雖然方便、實用,但是,由于其功能太多,如游戲,社區(qū),電子郵件等功能,占據(jù)內(nèi)存空間過大,從一定程度上來說,更多的已經(jīng)演變成了一種娛樂工具,不能作為即時通訊的專用工具。Winsock為Windows網(wǎng)絡(luò)編程提供了豐富的接口技術(shù),結(jié)合多線程技術(shù),使得此處的基于TCP網(wǎng)絡(luò)編程具有良好的健壯性和強大的可擴展性。綜上所述,本系統(tǒng)的設(shè)計與開發(fā)在技術(shù)上和硬件設(shè)備上的條件都是滿足的,因此,它是可行的。這些協(xié)議絕大多數(shù)建立在TCP/IP協(xié)議族上,約定好通用的通信方式、語義、及數(shù)據(jù)格式,即即時通訊應(yīng)用協(xié)議。,筆者認(rèn)為有幾點必須考慮:(1) 協(xié)議對下層協(xié)議的支持考慮到程序開發(fā)者對下層協(xié)議選擇上有不同的看法,協(xié)議設(shè)計時必須考慮下層的協(xié)議,以便程序開發(fā)者根據(jù)不同的下層協(xié)議運用不同的傳輸手段。(4)協(xié)議的通用性與可擴展性:由于無法對新技術(shù)的發(fā)展有精確的把握應(yīng)在協(xié)議中留有冗余位,以便適應(yīng)新的應(yīng)用。sizeof(FUN),sizeof(LOGIN)都是4byte。CSocket ClientSocket。 //服務(wù)器端需要指定一個端口號()。//Address服務(wù)器的地址,Port是端口號(5)服務(wù)器接受鏈接。(6)客戶端發(fā)送消息,例如:( string ,buf )。Bind(),關(guān)聯(lián)一本地地址到套接字sListen。Recv()/send(),在套接字sClient上收發(fā)數(shù)據(jù),直到完成交換。Closesocket(),關(guān)閉套接字sClient。用它來聲明一組命名的常數(shù),當(dāng)一個變量有幾種可能的取值時,可以將它定義為枚舉類型,在win32機器上,枚舉類型所占字節(jié)數(shù)總是4byte,在上面代碼片段中sizeof(enum)。(2) senderID定義為char類型,是發(fā)送者的標(biāo)識,用以標(biāo)記信息的來源ID;(3) RecerverID定義為char類型,是接收者的標(biāo)識,用以標(biāo)記信息的目的ID;(4) Connect定義為char類型,是要傳輸?shù)臄?shù)據(jù);(5) Len定義為int類型,記錄了傳輸數(shù)據(jù)的長度,用于在服務(wù)器端進行簡單校驗,如果出錯,則提醒發(fā)送者傳輸錯誤,同時直接丟棄接受到的錯誤數(shù)據(jù),否則轉(zhuǎn)發(fā)數(shù)據(jù)給接收者; 協(xié)議設(shè)計代碼皮片段typedef enum {LOGIN,LOGOUT,LOGOK,LOGERR,SHAKE,TRANSMIT,SVRSTOP,ERR} FUN。 char Connect[1024]。 可靠性控制 本次協(xié)議設(shè)計中。 }(3)服務(wù)器錯誤處理void CDlgTCPSeverDlg::DealErr(NET_PACK *pPack){ listCClientSocket*::iterator itor。 if (!pSocketGetUID().Compare(pPacksenderID)) { NET_PACK pack。 lstrcpy(,_T(傳送出錯!))。} 服務(wù)器端工程設(shè)計【File】|【New】菜單項,在新建對話框中選擇MFCAppWizard[exe]選項,輸入工程名“DlgTCPSever”。在新建的工程中打開工作臺中的【resource View】選項,單擊【dialog】選項,打開對話框編輯器,拖動控件,設(shè)計對話框界面,如圖:添加前:設(shè)置控件屬性完成后:添加消息處理代碼。 (1,_T(用戶名),LVCFMT_LEFT,120)。 CString strTitle。 if (!(m_nPort,SOCK_STREAM,m_strIP)) { AfxMessageBox(_T(CSocket創(chuàng)建失??!))。 return。 (FALSE)。 MessageBox(退出程序)。(FALSE)。()。 (n,strTemp)。 (n,2,strTemp)。 if (()) { AfxMessageBox(用戶名不能為空!)。 } if (!(m_strIP,m_nPort)) { AfxMessageBox(_T(CSocket連接失?。?)。(TRUE)。(_T(客戶端%s登陸),strRet)。pack,0,sizeof(NET_PACK))。 lstrcpy(,str)。SetWindowText(_T(客戶端))。(FALSE)。 memset(amp。 (str)。 ()。 = SHAKE。(strUser)。}(4)“發(fā)送”控件代碼設(shè)計:void CDlgTCPClientDlg::OnBtnSend() { // TODO: Add your control notification handler code hereCString strContent,strUser。 } NET_PACK pack。 =lstrlen(strContent)。strContent = strUser。pack,sizeof(NET_PACK))。strContent += 。}(4)“好友列表”控件代碼設(shè)計:void CDlgTCPClientDlg::IniCtruls(){ SetWindowText(_T(客戶端))。(FALSE)。}(5)單擊好友獲得接受者填入“接收者”編輯框代碼:void CDlgTCPClientDlg::OnClickListFriend(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code hereint n = ()。(TRUE)。 CDialog::OnClose()。 break。 break。 break。}(7)消息處理代碼:a. 用戶登錄,對應(yīng)協(xié)議“NET_PACK”的前4byte,功能選擇“fun”的“LOGIN”。}b. 用戶登錄,對應(yīng)協(xié)議“NET_PACK”的前4byte,功能選擇“fun”的“LOGOUT”。 if (!(SenderID)) { (i)。 } break。}}c. 用戶登錄,對應(yīng)協(xié)議“NET_PACK”的前4byte,功能選擇“fun”的“SVRSTOP”。 (TRUE)。 (TRUE)。void CDlgTCPClientDlg::DealShake(){ CRect rc。i++) { SetWindowPos(amp。CWnd::wndTopMost, 3,(),(),SWP_NOSIZE)。 Sleep(30)。void CDlgTCPClientDlg::DealTransmit(NET_PACK *pPack){ CString strContent。 strContent += (_T(%H:%M:%S\r\n * ))。 (strContent)。每次有新的客戶請求建立連接時,服務(wù)器度那聚會調(diào)用該類,創(chuàng)建一個新的ClientSocket加入到鏈表中,記錄登陸客戶,m_strUID作為索引。// Overridespublic: CString amp。 // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CClientSocket) public: virtual void OnReceive(int nErrorCode)。endifinclude /////////////////////////////////////////////////////////////////////////////// CClientSocketlistCClientSocket* CClientSocket::m_listClient。AfxGetApp()m_pMainWndPostMessage(WM_NET_RECEIVE,(WPARAM)pPack,(LPARAM)this)。 CClientSocket::GetUID(){ return m_strUID。 }(2)這個Socket不停地監(jiān)聽是否有來自于網(wǎng)絡(luò)上的鏈接請求if (!()) { AfxMessageBox(_T(CSocket監(jiān)聽失?。?)。CDlgTCPClientDlg類中定義了CClientSocket 的實例對象 m_ClientSocket;CClientSocket m_ClientSocket。 ()。CSocket::OnAccept(nErrorCode)。return。 = TRANSMIT。lstrcpy(,strUser)。 (amp。 strContent += (_T(%H:%M:%S\r\n * ))。 (strContent)。 = SHAKE。(strUser)。}(8)服務(wù)器接收客戶端送來的消息void CClientSocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class NET_PACK *pPack = new NET_PACK。CSocket::OnReceive(nErrorCode)。 pPack = (NET_PACK *)wParam。 break。 break。}void CDlgTCPSeverDlg::DealLogin(const NET_PACK *pPack,CClientSocket *pSocket){ InSertLog(pPacksenderID,_T(登錄))。 (_T(服務(wù)器當(dāng)前在線人數(shù)(%d)),CClientSocket::())。 itor != CClientSocket::()。 /* //不顯示當(dāng)前用戶的名字 if (CClientSocket::() 0) { for (IDitor = CClientSocket::()。//移動到最后一個 } */ Enditor = CClientSocket::()。IDitor++) { CClientSocket *pIDSocket = *IDitor。 = LOGIN。 } } }}void CDlgTCPSeverDlg::DealLogOut(const NET_PACK *pPack){ listCClientSocket*::iterator itorTemp。 itor != CClientSocket::()
點擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1