




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、word 計(jì)算機(jī)通信原理 課程工程實(shí)施報(bào)告題目(3): 滑動(dòng)窗口協(xié)議的模擬 組 號(hào): 任課教師: 組 長(zhǎng): 成 員: 20% 成 員: 20% 成 員: 20% 成 員: 20% 聯(lián)系方式: .word目錄一、 工程要求3二、 工程成果3三、 程序原理31、 滑動(dòng)窗口協(xié)議3A、窗口機(jī)制3B、1比特滑動(dòng)窗口協(xié)議5C、后退停等協(xié)議6D、選擇重傳協(xié)議72、 用戶數(shù)據(jù)報(bào)協(xié)議UDP7四、 程序設(shè)計(jì)說(shuō)明8五、 主要數(shù)據(jù)結(jié)構(gòu)說(shuō)明及主要函數(shù)8六、收獲建議17.word一、 工程要求本課題通過(guò)設(shè)計(jì)軟件,實(shí)現(xiàn)對(duì)滑動(dòng)窗口協(xié)議的模擬.設(shè)計(jì)要求:1. Windows 環(huán)境下運(yùn)行,程序應(yīng)在1-2臺(tái)PC上運(yùn)行;2. 演示在
2、兩臺(tái)計(jì)算機(jī)間傳輸文件。允許在同一臺(tái)機(jī)器中用兩個(gè)獨(dú)立線程來(lái)模擬;3. 功能:1 由一臺(tái)PC線程向另一臺(tái)PC線程發(fā)送數(shù)據(jù)包,界面應(yīng)顯示出雙方幀個(gè)數(shù)變化,幀序號(hào),發(fā)送和接受速度,暫?;蛑貍魈崾镜龋缑嬷斜仨殑?dòng)態(tài)顯示數(shù)據(jù)幀的發(fā)送情況和接受情況,包括在相應(yīng)窗口詳細(xì)顯示相應(yīng)的ACK和其他收發(fā)數(shù)據(jù)幀后發(fā)出的消息,以說(shuō)明模擬協(xié)議的正確運(yùn)作過(guò)程。2 接收方及發(fā)送方應(yīng)具有按序收發(fā)幀的能力;3 接受方應(yīng)有固定大小的滑動(dòng)窗口,并對(duì)收到信息緩存。當(dāng)發(fā)送方速度過(guò)快或幀喪失超時(shí),接受方應(yīng)發(fā)送消息,要求暫?;蛑貍鳎? 發(fā)送方發(fā)送速度應(yīng)可以調(diào)節(jié),并可以暫?;蛑匕l(fā);5 發(fā)送方重傳時(shí)可僅重傳幀喪失幀;4. 以上幾個(gè)功能應(yīng)可視,要求
3、有簡(jiǎn)單界面;二、 工程成果三、 程序原理1、 滑動(dòng)窗口協(xié)議A、窗口機(jī)制滑動(dòng)窗口協(xié)議的根本原理就是在任意時(shí)刻,發(fā)送方都維持了一個(gè)連續(xù)的允許發(fā)送的幀的序號(hào),稱為發(fā)送窗口;同時(shí),接收方也維持了一個(gè)連續(xù)的允許接收的幀的序號(hào),稱為接收窗口。發(fā)送窗口和接收窗口的序號(hào)的上下界不一定要一樣,甚至大小也可以不同。不同的滑動(dòng)窗口協(xié)議窗口大小一般不同。發(fā)送方窗口內(nèi)的序列號(hào)代表了那些已經(jīng)被發(fā)送,但是還沒(méi)有被確認(rèn)的幀,或者是那些可以被發(fā)送的幀以發(fā)送窗口尺寸為2,接收窗口尺寸為1分析:初始態(tài),發(fā)送方?jīng)]有幀發(fā)出,發(fā)送窗口前后沿相重合。接收方0號(hào)窗口翻開(kāi),等待接收0號(hào)幀;發(fā)送方翻開(kāi)0號(hào)窗口,表示已發(fā)出0幀但尚確認(rèn)返回信息。此
4、時(shí)接收窗口狀態(tài)不變;發(fā)送方翻開(kāi)0、1號(hào)窗口,表示0、1號(hào)幀均在等待確認(rèn)之列。至此,發(fā)送方翻開(kāi)的窗口數(shù)已達(dá)規(guī)定限度,在未收到新確實(shí)認(rèn)返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀。接收窗口此時(shí)狀態(tài)仍未變;接收方已收到0號(hào)幀,0號(hào)窗口關(guān)閉,1號(hào)窗口翻開(kāi),表示準(zhǔn)備接收1號(hào)幀。此時(shí)發(fā)送窗口狀態(tài)不變;發(fā)送方收到接收方發(fā)來(lái)的0號(hào)幀確認(rèn)返回信息,關(guān)閉0號(hào)窗口,表示從重發(fā)表中刪除0號(hào)幀。此時(shí)接收窗口狀態(tài)仍不變;發(fā)送方繼續(xù)發(fā)送2號(hào)幀,2號(hào)窗口翻開(kāi),表示2號(hào)幀也納入待確認(rèn)之列。至此,發(fā)送方翻開(kāi)的窗口又已達(dá)規(guī)定限度,在未收到新確實(shí)認(rèn)返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀,此時(shí)接收窗口狀態(tài)仍不變;接收方已收到1號(hào)幀,1號(hào)窗口
5、關(guān)閉,2號(hào)窗口翻開(kāi),表示準(zhǔn)備接收2號(hào)幀。此時(shí)發(fā)送窗口狀態(tài)不變;發(fā)送方收到接收方發(fā)來(lái)的1號(hào)幀收畢確實(shí)認(rèn)信息,關(guān)閉1號(hào)窗口,表示從重發(fā)表中刪除1號(hào)幀。此時(shí)接收窗口狀態(tài)仍不變。假設(shè)從滑動(dòng)窗口的觀點(diǎn)來(lái)統(tǒng)一看待1比特滑動(dòng)窗口、后退n及選擇重傳三種協(xié)議,它們的差異僅在于各自窗口尺寸的大小不同而已。1比特滑動(dòng)窗口協(xié)議:發(fā)送窗口=1,接收窗口=1;后退n協(xié)議:發(fā)窗口>1,接收窗口>1;選擇重傳協(xié)議:發(fā)送窗口>1,接收窗口>1。B、1比特滑動(dòng)窗口協(xié)議當(dāng)發(fā)送窗口和接收窗口的大小固定為1時(shí),滑動(dòng)窗口協(xié)議退化為停等協(xié)議stopandwait。該協(xié)議規(guī)定發(fā)送方每發(fā)送一幀后就要停下來(lái),等待接收方已
6、正確接收確實(shí)認(rèn)acknowledgement返回后才能繼續(xù)發(fā)送下一幀。由于接收方需要判斷接收到的幀是新發(fā)的幀還是重新發(fā)送的幀,因此發(fā)送方要為每一個(gè)幀加一個(gè)序號(hào)。由于停等協(xié)議規(guī)定只有一幀完全發(fā)送成功后才能發(fā)送新的幀,因而只用一比特來(lái)編號(hào)就夠了C、后退停等協(xié)議由于停等協(xié)議要為每一個(gè)幀進(jìn)行確認(rèn)后才繼續(xù)發(fā)送下一幀,大大降低了信道利用率,因此又提出了后退n協(xié)議。后退n協(xié)議中,發(fā)送方在發(fā)完一個(gè)數(shù)據(jù)幀后,不停下來(lái)等待應(yīng)答幀,而是連續(xù)發(fā)送假設(shè)干個(gè)數(shù)據(jù)幀,即使在連續(xù)發(fā)送過(guò)程中收到了接收方發(fā)來(lái)的應(yīng)答幀,也可以繼續(xù)發(fā)送。且發(fā)送方在每發(fā)送完一個(gè)數(shù)據(jù)幀時(shí)都要設(shè)置超時(shí)定時(shí)器。只要在所設(shè)置的超時(shí)時(shí)間內(nèi)仍收到確認(rèn)幀,就要重發(fā)
7、相應(yīng)的數(shù)據(jù)幀。如:當(dāng)發(fā)送方發(fā)送了N個(gè)幀后,假設(shè)發(fā)現(xiàn)該N幀的前一個(gè)幀在計(jì)時(shí)器超時(shí)后仍未返回其確認(rèn)信息,那么該幀被判為出錯(cuò)或喪失,此時(shí)發(fā)送方就不得不重新發(fā)送出錯(cuò)幀及其后的N幀。D、選擇重傳協(xié)議在后退n協(xié)議中,接收方假設(shè)發(fā)現(xiàn)錯(cuò)誤幀就不再接收后續(xù)的幀,即使是正確到達(dá)的幀,這顯然是一種浪費(fèi)。另一種效率更高的策略是當(dāng)接收方發(fā)現(xiàn)某幀出錯(cuò)后,其后繼續(xù)送來(lái)的正確的幀雖然不能立即遞交給接收方的高層,但接收方仍可收下來(lái),存放在一個(gè)緩沖區(qū)中,同時(shí)要求發(fā)送方重新傳送出錯(cuò)的那一幀。一旦收到重新傳來(lái)的幀后,就可以原已存于緩沖區(qū)中的其余幀一并按正確的順序遞交高層。這種方法稱為選擇重發(fā)(SELECTICE REPEAT)。2、
8、 用戶數(shù)據(jù)報(bào)協(xié)議UDP用戶數(shù)據(jù)報(bào)協(xié)議User Datagram Protocol, UDP是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的傳輸層協(xié)議,正式標(biāo)準(zhǔn)為RFC 768。UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)報(bào)的形式。一個(gè)典型的數(shù)據(jù)報(bào)就是一個(gè)二進(jìn)制數(shù)據(jù)的傳輸單位。每一個(gè)數(shù)據(jù)報(bào)的前8個(gè)字節(jié)用來(lái)包含報(bào)頭信息,剩余字節(jié)那么用來(lái)包含具體的傳輸數(shù)據(jù)。主要特點(diǎn):1、UDP是無(wú)連接的。2、UDP使用最大努力交付。3、UDP是面向報(bào)文的。4、UDP沒(méi)有阻塞控制。5、UDP支持一對(duì)一、一對(duì)多、多對(duì)一、多對(duì)多的交互通信。6、UDP的首部開(kāi)銷小。UDP報(bào)頭由4個(gè)域組成,其中每個(gè)域各占用2個(gè)字節(jié),具體如下:源端口號(hào)、目標(biāo)端口號(hào)
9、、數(shù)據(jù)報(bào)長(zhǎng)度、校驗(yàn)值。UDP協(xié)議使用報(bào)頭中的校驗(yàn)值來(lái)保證數(shù)據(jù)的平安。校驗(yàn)值首先在數(shù)據(jù)發(fā)送方通過(guò)特殊的算法計(jì)算得出,在傳遞到接收方之后,還需要再重新計(jì)算。如果某個(gè)數(shù)據(jù)報(bào)在傳輸過(guò)程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗(yàn)計(jì)算值將不會(huì)相符,由此UDP協(xié)議可以檢測(cè)是否出錯(cuò)。這與TCP協(xié)議是不同的,后者要求必須具有校驗(yàn)值。四、 程序設(shè)計(jì)說(shuō)明程序可分為兩個(gè)局部:發(fā)送端和接收端。發(fā)送端和接收端的主要程序流程大致相同如下:1、翻開(kāi)程序,程序初始化初始化套接字,創(chuàng)立套接字,綁定端口,創(chuàng)立udp接收線程2、初始化完成后,發(fā)送端開(kāi)始發(fā)送數(shù)據(jù)同時(shí)等待接收端發(fā)送等待幀號(hào)NAK,接收端接收數(shù)據(jù),并
10、發(fā)送所要等待的幀號(hào)NAK,如果幀號(hào)正確那么接收并提取,如果幀號(hào)不正確但是數(shù)據(jù)正確那么放置緩存區(qū)。3、暫停或退出。五、 主要數(shù)據(jù)結(jié)構(gòu)說(shuō)明及主要函數(shù)主要數(shù)據(jù)結(jié)構(gòu):發(fā)送端: 接收端:Udp報(bào)文傳輸為不可靠傳輸,滑窗協(xié)議到達(dá)可靠傳輸,需要給udp報(bào)文的頭部加上序號(hào)和確認(rèn)幀,協(xié)議格式:typedef UINT seqNum;typedef enum DATA, ACK, NAK frameKind; /報(bào)文類型typedef enum NO_ERR, CKSUM_ERR, LOST_ERR errMode; /錯(cuò)誤模式typedef struct UCHAR dataMAX_PKT; packet; /
11、報(bào)文內(nèi)容/typedef struct frameKind kind;seqNum seq;seqNum ack;int size;/數(shù)據(jù)長(zhǎng)度,不包括幀頭errMode err;/該字段用于模擬信道出錯(cuò) framframe_hdr;typedef structframe_hdr hdr;packet info; frame;函數(shù)說(shuō)明:1、 程序初始化初始化套接字,創(chuàng)立套接字,綁定端口,創(chuàng)立udp接收線程BOOL CSenderDlg:OnInitDialog()CDialog:OnInitDialog();/ Add "About." menu item to system
12、 menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->A
13、ppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/初始化WinSockWSADATA wsa;if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)AfxMessageBox("Failed to initialize the winsock 2 stack");return FALSE;/創(chuàng)立UDP Sender Socketif (m_UDPSndrSocket = WSASocket(AF_INET, SO
14、CK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED) = INVALID_SOCKET)AfxMessageBox("Failed to create UDPSocket");return FALSE;/填充本地UDP Sender Socket地址結(jié)構(gòu)SOCKADDR_IN UDPSndrAddr;memset(&UDPSndrAddr, 0, sizeof(SOCKADDR_IN);UDPSndrAddr.sin_family = AF_INET;UDPSndrAddr.sin_port = htons(307
15、3);UDPSndrAddr.sin_addr.S_un.S_addr = inet_addr("");/綁定Sender UDP端口if (bind(m_UDPSndrSocket, (sockaddr*)&UDPSndrAddr, sizeof(UDPSndrAddr) = SOCKET_ERROR )AfxMessageBox("Failed to bind UDPSndrAddr");return FALSE;/填充Receiver UDP地址memset(&m_UDPRcvrAddr, 0, sizeof(SO
16、CKADDR_IN);m_UDPRcvrAddr.sin_family = AF_INET;m_UDPRcvrAddr.sin_port = htons(3074);m_UDPRcvrAddr.sin_addr.S_un.S_addr = inet_addr("");/創(chuàng)立UDP數(shù)據(jù)包接收線程DWORD dwThreadId;CreateThread(NULL, 0, UdpReceiveThread, this, 0, &dwThreadId);return TRUE; / return TRUE unless you set the focus
17、 to a control 2、按下開(kāi)始發(fā)送鍵,的一些列窗口初始化以及錯(cuò)誤幀設(shè)定,并且開(kāi)啟定時(shí)器,設(shè)定窗口界面控制:void CSenderDlg:OnStartSend() / TODO: Add your control notification handler code here/獲取對(duì)話框數(shù)據(jù)if (!UpdateData(TRUE)return;/初始化所有參數(shù)if (m_pOutBuf != NULL)delete m_pOutBuf;m_pOutBuf = new framem_SendWndSize;m_iBuffered = 0;/當(dāng)前滑動(dòng)窗口大小m_ackExpected
18、= 0;/發(fā)送窗口左側(cè) m_nextFrameToSend = 0;/發(fā)送窗口右側(cè)+1for (int i=0; i<MAX_SEQ+1; i+) /錯(cuò)誤模式初始均為NO_ERRm_errArrayi = NO_ERR;/設(shè)置幀的錯(cuò)誤模式,模擬傳輸錯(cuò)誤。char tmp256;char *token;char seps = " "int iSeq;if (!m_strFrameLost.IsEmpty()strcpy_s(tmp, m_strFrameLost);token = strtok(tmp, seps);while (token != NULL)iSeq =
19、 atoi(token);token = strtok(NULL, seps);if (iSeq < 0 | iSeq > MAX_SEQ)AfxMessageBox("Invalid seqno in LostFrame box, ignore it");continue;m_errArrayiSeq = LOST_ERR;if (!m_strChksumErr.IsEmpty()strcpy_s(tmp, m_strChksumErr);token = strtok(tmp, seps);while (token != NULL)iSeq = atoi(to
20、ken);token = strtok(NULL, seps);if (iSeq < 0 | iSeq > MAX_SEQ)AfxMessageBox("Invalid seqno in ChksumErr box, ignore it");continue;m_errArrayiSeq = CKSUM_ERR;/啟動(dòng)網(wǎng)絡(luò)層數(shù)據(jù)發(fā)送定時(shí)器SetTimer(ID_SEND_TIMER, m_SendInterval, NULL);/窗口界面控制GetDlgItem(IDC_SEND_WND_SIZE)->EnableWindow(FALSE);GetDlgI
21、tem(IDC_SEND_INTERVAL)->EnableWindow(FALSE);GetDlgItem(IDC_RESEND_TIMER)->EnableWindow(FALSE);GetDlgItem(IDC_MANUAL_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_CHKSUM_ERR)->EnableWindow(FALSE);GetDlgItem(IDC_FRAME_LOST)->EnableWindow(FALSE);GetDlgItem(IDC_START_SEND)->EnableWindow(FAL
22、SE);GetDlgItem(IDC_STOP_SEND)->EnableWindow();CString strMsg;strMsg.Format("%d", m_ackExpected);GetDlgItem(IDC_BOTTOM)->SetWindowText(strMsg);strMsg.Format("%d", m_nextFrameToSend);GetDlgItem(IDC_TOP)->SetWindowText(strMsg);GetDlgItem(IDC_CUR_FRAME)->SetWindowText(&qu
23、ot;0");3、計(jì)時(shí)器所要執(zhí)行的程序:未超時(shí)的時(shí)候發(fā)送數(shù)據(jù)幀程序和超時(shí)之后重新發(fā)送數(shù)據(jù)幀程序void CSenderDlg:OnTimer(UINT nIDEvent) switch(nIDEvent)case ID_SEND_TIMER:if (m_iBuffered < m_SendWndSize)PostMessage(NETWORK_LAYTER_READY);break;default: /case timeoutint framePos = nIDEvent - ID_TIMER_USER;ASSERT(framePos>=0 && fram
24、ePos<m_SendWndSize);ReSendFrame(framePos);break;CDialog:OnTimer(nIDEvent);4、 重新發(fā)送數(shù)據(jù)幀程序,重新發(fā)送的數(shù)據(jù)幀不帶有錯(cuò)誤模式void CSenderDlg:ReSendFrame(int framePos)frame* pFrame = &m_pOutBufframePos;pFrame->hdr.err = NO_ERR;/重發(fā)時(shí)去掉出錯(cuò)模擬ToPhysicalLayer(char*)pFrame, sizeof(pFrame->hdr);SetTimer(framePos + ID_T
25、IMER_USER, m_ResendTime, NULL); /重發(fā)定時(shí)器/窗口顯示char buf32;_strtime_s(buf);CString strMsg;strMsg.Format("%s %5s %8s %7s %3d", buf, "data", "re-sent", "normal", pFrame->hdr.seq);m_ListOutput.AddString(strMsg);int iCount = m_ListOutput.GetCount();if (iCount > 0
26、)m_ListOutput.SetCurSel(iCount-1);5、UDP接收線程DWORD CSenderDlg:UdpReceiveThread(LPVOID lpParam)CSenderDlg* pDlg = (CSenderDlg*)lpParam;pDlg->UdpReceive();return 0;6、 接收udp函數(shù),接收upd應(yīng)答包,并檢測(cè)是確認(rèn)幀ack還是申請(qǐng)發(fā)送幀nak,并發(fā)出相應(yīng)的指令,如果是ack正常發(fā)送,如果是nak那么重發(fā)。void CSenderDlg:UdpReceive()char bufsizeof(frame);int BytesReceiv
27、ed;while (TRUE)/接收UDP應(yīng)答包if (BytesReceived=recvfrom(m_UDPSndrSocket, buf, sizeof(buf), 0, NULL, NULL) = SOCKET_ERROR)TRACE("Failed to recvfrom UDPSndrSocket, ErrCode: %dn", WSAGetLastError(); /10054錯(cuò)誤是正常的/AfxMessageBox("Failed to recvfrom UDPSndrSocket");continue;ASSERT(BytesRecei
28、ved>=sizeof(frame_hdr) && BytesReceived<=sizeof(frame);if (BytesReceived>=sizeof(frame_hdr) && BytesReceived<=sizeof(frame)frame* pFrame = (frame*)buf;TRACE("Get %s%d, errMode=%dn", (pFrame->hdr.kind=ACK)"Ack":"Nak", pFrame->hdr.ack, pF
29、rame->hdr.err);if (pFrame->hdr.err = NO_ERR)frame* p = new frame;memcpy(p, buf, BytesReceived);PostMessage(FRAME_ARRIVAL, (WPARAM)p);7、從網(wǎng)絡(luò)層準(zhǔn)備工作,從網(wǎng)絡(luò)層取得數(shù)據(jù)LRESULT CSenderDlg:OnNetworkLayerReady(WPARAM wParam, LPARAM lParam)m_iBuffered+;/擴(kuò)展滑動(dòng)窗口大小FromNetworkLayer(&m_pOutBufm_nextFrameToSend % m
30、_SendWndS); /從網(wǎng)絡(luò)層取得數(shù)據(jù)SendFrame(DATA, m_nextFrameToSend); /發(fā)送數(shù)據(jù)幀Inc(m_nextFrameToSend); /擴(kuò)展滑動(dòng)窗口右沿/窗口顯示CString strMsg;strMsg.Format("%d", m_ackExpected);GetDlgItem(IDC_BOTTOM)->SetWindowText(strMsg);strMsg.Format("%d", m_nextFrameToSend);GetDlgItem(IDC_TOP)->SetWindow
31、Text(strMsg);return 0;8、 發(fā)送幀,并在窗口顯示發(fā)送情況void CSenderDlg:SendFrame(frameKind fk, seqNum seq)frame* pFrame = &m_pOutBufseq % m_SendWndSize;pFrame->hdr.kind = fk;pFrame->hdr.seq = seq;pFrame->hdr.err = m_errArrayseq;ToPhysicalLayer(char*)pFrame, sizeof(pFrame->hdr);SetTimer(seq % m_SendW
32、ndSize + ID_TIMER_USER, m_ResendTime, NULL); /重發(fā)定時(shí)器/窗口顯示格式char buf32;_strtime_s(buf);CString strErrmode;if (pFrame->hdr.err = NO_ERR)strErrmode = "normal"else if (pFrame->hdr.err = CKSUM_ERR)strErrmode = "chkerr"elsestrErrmode = "lost"CString strMsg;strMsg.Format(
33、"%s %5s %8s %7s %3d", buf, "data", "sent", strErrmode, pFrame->hdr.seq);m_ListOutput.AddString(strMsg);int iCount = m_ListOutput.GetCount();if (iCount > 0)m_ListOutput.SetCurSel(iCount-1);9、 從網(wǎng)絡(luò)層將udp幀發(fā)送到物理層并顯示發(fā)送。void CSenderDlg:ToPhysicalLayer(char* pBuf, int iSiz
34、e)sendto(m_UDPSndrSocket, pBuf, iSize, 0, (sockaddr*)&m_UDPRcvrAddr, sizeof(m_UDPRcvrAddr);/窗口顯示CString strMsg;strMsg.Format("%d", (frame_hdr*)pBuf)->seq);GetDlgItem(IDC_CUR_FRAME)->SetWindowText(strMsg);10、 udp幀到達(dá)物理層,顯示和分析接收到的的udp報(bào)文是確認(rèn)幀還是申請(qǐng)發(fā)送幀,并將其顯示在界面上,并調(diào)整滑動(dòng)窗口的位置。LRESULT CSende
35、rDlg:OnFrameArrival(WPARAM wParam, LPARAM lParam)frame ackFrame;FromPhysicalLayer(char*)&ackFrame, (char*)wParam);/窗口顯示TRACE("arrived %s%dn", (ackFrame.hdr.kind=ACK)"Ack":"Nak", ackFrame.hdr.ack);char buf32;_strtime_s(buf);CString strMsg;strMsg.Format("%s %5s %
36、8s %7s %3d", buf, (ackFrame.hdr.kind=ACK)"ack":"nak", "arrived", "normal", ackFrame.hdr.ack);m_ListOutput.AddString(strMsg);int iCount = m_ListOutput.GetCount();if (iCount > 0)m_ListOutput.SetCurSel(iCount-1);if (ackFrame.hdr.kind=NAK && Between(m_ackExpected, ackFrame.hdr.ack, m_nextFrameToSend)ReSendFrame(ackFrame.hdr.ack % m_SendWndSize);seqNum ackedSeq = (ackFrame.hdr.kind=ACK) ackFrame.hdr.ack : (ackFrame.hdr.ack+MAX_SEQ)%(MAX_SEQ+1);while (Between(m_ackExpected, ackedSeq, m_nextFrameToSend)m_iBuffered-;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鄆城幼兒面試試題及答案
- 6-甲酰基-5-(三氟甲基)煙酸乙酯hplc
- 5年級(jí)下冊(cè)英語(yǔ)第4單元單詞跟讀
- 5年級(jí)上冊(cè)簡(jiǎn)易方程
- 4年級(jí)下冊(cè)日積月累1~8單元
- 地下建筑火災(zāi)案例
- 2025年云南旅游職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)帶答案
- 2025年天津?yàn)I海職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)完美版
- 2025年南充文化旅游職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)及答案1套
- 2025年重慶資源與環(huán)境保護(hù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)1套
- 人教版三年級(jí)下冊(cè)品社不一樣的你我他公開(kāi)課獲獎(jiǎng)?wù)n件百校聯(lián)賽一等獎(jiǎng)?wù)n件
- 結(jié)構(gòu)化思維培訓(xùn)
- 2025年湖南安全技術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)必考題
- 社會(huì)福利 課件全套 高和榮 第1-11章 緒論-社會(huì)福利的挑戰(zhàn)
- 食品采購(gòu)員工工作計(jì)劃
- EPC工程項(xiàng)目建設(shè)管理機(jī)構(gòu)及權(quán)力職責(zé)
- 2024年林芝地區(qū)人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2025年全國(guó)國(guó)家版圖知識(shí)測(cè)試競(jìng)賽題庫(kù)(附答案)
- 旅游學(xué)概論-旅游產(chǎn)品和旅游市場(chǎng)
- 2024年居間業(yè)務(wù)收費(fèi)標(biāo)準(zhǔn)最高限額合同
- 河南省“極飛杯”無(wú)人機(jī)應(yīng)用技術(shù)技能大賽-無(wú)人機(jī)植保應(yīng)用-技術(shù)文件
評(píng)論
0/150
提交評(píng)論