資源描述:
《實(shí)時(shí)通信系統(tǒng)設(shè)計(jì)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Z-T-800Z謁腸必3Z0Ttz0B乙0誠(chéng)0哥聲王焙實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)多任務(wù)環(huán)境的編程,理解多任務(wù)程序中任務(wù)間通信和同步的方法;掌握Windows環(huán)境中多線程程序設(shè)計(jì)與實(shí)現(xiàn)方法。實(shí)驗(yàn)環(huán)境Windows環(huán)境下,使用VC及Windows提供的相關(guān)API接口。實(shí)驗(yàn)要求模擬多任務(wù)的交互過(guò)程,每個(gè)任務(wù)用線程實(shí)現(xiàn),基本要求如下:?任務(wù)1:接收從鍵盤(pán)鍵入的字符,發(fā)送給另一任務(wù)2;?任務(wù)2:接收任務(wù)1發(fā)來(lái)的字符,用事件的方式通知任務(wù)3接收;?任務(wù)3:接收任務(wù)2發(fā)來(lái)的字符,并顯示;?可增加其他功能,如:以秒顯示時(shí)間等;
2、?系統(tǒng)能退出。原理及方法每個(gè)任務(wù)都用線程實(shí)現(xiàn),相應(yīng)的API為CreateThread,原型如下HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,SIZE_TdwStackSize,LPTHREAD_START_ROUTINEIpStartAddressrLPVOID1pParameterfDWORDdwCreationFlags,LPDWORDlpThreadld);但是在C運(yùn)行時(shí)庫(kù)的環(huán)境下更合適的函數(shù)為.beignthread或
3、_beginthreadex°這樣創(chuàng)建名為taskA,taskB,taskC的三個(gè)任務(wù),其中taskA與taskB之間使用套接字的方法進(jìn)行通信,taskB與taskC之間使用事件和共享內(nèi)存(用windowsAPI所提供的criticalsection保護(hù)臨界區(qū)資源)的方法通信。在程序中所需使用的主要API如下:?uintptr_t_beginthread(void(*start_addr)(void*),unsigndstack_size,void*arglist)?intsendto(SOCKE
4、Ts,constchar*buf,intlenzintflags,conststructsockaddr*tozinttolen)?intrecvfrom(SOCKETfconstchar*butintlen,intflags,conststructsockaddr*from,intfromIen)?BOOLSetEvent(HANDLEhEvent)?DWORDWaitForSingleObject(HANDLEhHandleQWORDdwMilliseconds)?voidEnterCriti
5、calSection(LPCRITICAL_SECTIONIpCriticalSection)?voidLeaveCriticalSection(LPCRITICAL_SECTIONIpCriticalSection)實(shí)現(xiàn)過(guò)程首先,在main函數(shù)中進(jìn)行初始化操作,包括socket的初始化,任務(wù)的創(chuàng)建,同步事件的創(chuàng)建;以及程序退出時(shí)對(duì)上述資源的回收。intmain(intargctchar*argv[]){WSADATAws;^?SAStartup(MAKEWORD(2,2),&ws);Initia
6、1izeC『itica1Section(§ion);event=CreateEvent(0,FALSE,FALSE,0);idA=(HANDLE).beginthread(taskA,0,0);idB=(HANDLE)_beginthread(taskB,0,0);idC=(HANDLE)_beginthread(taskC,0,0);INFINITE);INFINITE);INFINITE);MitForSing1cObjcct(idA,WaitForSing1eObject(idB,W
7、aitForSing1eObject(idC,CloseHand1e(idA);CloseHand1e(idB);CloseHand1e(idC);\SAC1eanup();De1eteCritica1Section(§ion);printf(Mbye?bye”);return0;任務(wù)1由main函數(shù)創(chuàng)建,每當(dāng)從鍵盤(pán)接收到一個(gè)字符,就使用socket通過(guò)UDP協(xié)議發(fā)送給任務(wù)2,它們之間通信是用UDP的2400端口,如果鍵入的字符為ESC那么就先把它發(fā)送給任務(wù)2然后退岀運(yùn)行(其中#
8、defineESC27)。void__cdec1taskA(void*param){intret;charbuff32];SOCKETsock=socket(AF_INET,SOCK.DGRAM.0);sockaddr_inaddr;addr.sin_fami1y=AF_1NET;addr.sin_addr.s_addr=incl_addr("127.0.0.1");addr.sin_porI=htons(2400);whi1e(TRUE){buf[0]=_getch();ret=