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

正文內(nèi)容

linux環(huán)境下多媒體教學系統(tǒng)的設計與實現(xiàn)的學士學位畢業(yè)論文(編輯修改稿)

2025-07-16 14:14 本頁面
 

【文章內(nèi)容簡介】 guchar ClientIP[NET_IPLEN]。 // IP地址 guchar ClientHost[NET_HOSTLEN]。 // 主機名 guchar ClientName[NET_NAMELEN]。 // 用戶名(姓名) guchar ClientID[NET_IDLEN]。 // 用戶標識(學號)}CLIENTINFO, *PCLIENTINFO。學生端信息數(shù)據(jù)結構如下:typedef struct tagCLISTCLIENTINFO{ gboolean bSelected。 // 該學生端是否被選中 gint iState。 // 該學生端的狀態(tài) CLIENTINFO ClientInfo。} CLISTCLIENTINFO, *PCLISTCLIENTINFO。學生端信息列表數(shù)據(jù)結構如下:typedef struct tagCLISTINFO{ pthread_mutex_t Mutex。 // 互斥鎖 CLISTCLIENTINFO ClistClinetInfo[THREAD_MAXCLIENT]。 // 學生端信息列表 gint iCnt。 // 列表中學生端的數(shù)量} CLISTINFO, *PCLISTINFO。學生端的狀態(tài)定義為以下幾種:define CLIST_STATE_UNUSED 0x00 // 未使用define CLIST_STATE_ONLINE 0x01 // 在線define CLIST_STATE_SCREENBROADCAST 0x02 // 屏幕廣播中define CLIST_STATE_REMOTECONTROL 0x03 // 遠程控制中與指令隊列相同,學生端信息列表也是全局的,考慮到線程同步,因此所有對該列表的操作必須先使用pthread_mutex_lock( amp。() )將列表鎖定,然后才能進行具體操作,操作結束后,必須使用pthread_mutex_unlock( amp。( ) )將列表解鎖。對學生端信息列表的操作有:gint afxAddToClistInfo( PCLISTINFO pClistInfo, PCLIENTINFO pClientInfo )。 // 向?qū)W生端信息列表中增加一個學生端信息gint afxRemoveFromClistInfo( PCLISTINFO pClistInfo,PCLIENTINFO pClientInfo )。 // 從學生端信息列表中刪除一個學生端信息gint afxSelectInClistInfo( PCLISTINFO pClistInfo, gchar *pcIP )。 // 將學生端信息列表中IP為pcIP的學生端標記為選中gint afxUnSelectInClistInfo( PCLISTINFO pClistInfo, gchar *pcIP )。 // 將學生端信息列表中IP為pcIP的學生端解除選中gint afxGetCntInClistInfo( PCLISTINFO pClistInfo )。 // 獲得學生端信息列表中學生端的數(shù)量以下的操作以學生端信息列表為參考,對指令隊列進行操作:gint afxSendMessageToSelectedClient( PCLISTINFO pClistInfo, PMESSAGEQUEUE pMessageQueue, PMESSAGE pMessage )。 // 向標記為選中的學生端發(fā)送指令gint afxSendMessageToAllClient( PCLISTINFO pClistInfo, PMESSAGEQUEUEpMessageQueue, PMESSAGE pMessage )。 // 向所有的學生端發(fā)送指令gint afxSendMessageToSrcBtClient( PCLISTINFO pClistInfo, PMESSAGEQUEUE pMessageQueue, PMESSAGE pMessage )。 // 向正在接收屏幕廣播的學生端發(fā)送指令gint afxSendMessageToRmtCtrlClient( PCLISTINFO pClistInfo, PMESSAGEQUEUE pMessageQueue, PMESSAGE pMessage )。 // 向正在被遠程控制的學生端發(fā)送指令 命令控制模塊 教師端命令控制模塊該模塊實際上是一個TCP服務端線程,負責管理學生端的連接,保存學生端信息,響應學生端請求,或從控制指令隊列中取出指令,解析后發(fā)送相應的指令給學生端或者界面控制模塊。由于學生端數(shù)量較多——可能會有100個以上,若為每一個學生端創(chuàng)建一個服務線程,則線程之間的頻繁切換會使整個系統(tǒng)的效率變得很低,所以放棄了采用多線程的并發(fā)連接服務器算法,而采用了單線程的并發(fā)服務器算法。 并發(fā)服務器算法。以下是教師端命令控制模塊的總框架:void* thread_TCPServer_main( void *arg ){ 初始化 …… while ( …… ) { 每隔一段時間通知所有學生端:教師端仍處于活動狀態(tài)(用于超時檢測) select( iFDMax + 1, amp。ReadFDSet, amp。WriteFDSet, NULL, NULL )。 if ( FD_ISSET( iListenSocketFD, amp。ReadFDSet ) ) // 如果有學生端連接 { iConnectSocketFD = accept( iListenSocketFD, (struct sockaddr*)amp。ClientAddr, amp。iAddrlen )。 // 接受該連接 處理學生端的連接信息 } for ( k = 0。 k = iClientMax。 k++ ) { if ( 該學生端超時 ) { 關閉該學生端的socket連接 if ( 教師端正在廣播 ) { if ( 沒有學生端在線 ) { 關閉圖像發(fā)送線程 } } if ( 正在遠程控制 ) { 關閉圖像接收線程 } 從學生端信息列表中刪除該學生端 } if ( FD_ISSET( iClientSocketFD, amp。WriteFDSet ) ) // 如果可以向該學生端發(fā)送指令 { if ( !afxPeekMessage( amp。afxCommandQ, amp。Message ) ) // 如果控制指令隊列里有指令 { if ( 如果該指令是發(fā)送給當前學生端的 ) { afxGetMessage( amp。afxCommandQ, amp。Message )。 // 取得該指令 switch ( ) { // 根據(jù)不同的控制指令做相應的處理 ……: } send( iClientSocketFD, amp。CommandPackWrite, NET_COMMANDPACKSIZE, 0 )。 // 向?qū)W生端發(fā)出相應的控制指令 } else { if ( 該指令的發(fā)送對象已經(jīng)斷開連接 ) { afxGetMessage( amp。afxCommandQ, NULL )。 // 該指令作廢 } } } } if ( FD_ISSET( iClientSocketFD, amp。ReadFDSet ) ) // 如果有來自學生端的指令 { recv( iClientSocketFD, amp。CommandPackRead, NET_COMMANDPACKSIZE, 0 )。 // 接收該指令 switch ( ) { // 根據(jù)接收到的不同的指令做相應的處理 …… } } } } 關閉所有socket} 學生端命令控制模塊與教師端命令控制模塊相對應的,該模塊實際上是一個TCP客戶端線程,負責響應教師端的指令,解析后發(fā)送相應的指令給教師端或者界面控制模塊。以下是學生端命令控制模塊的總框架:void* thread_TCPClient_main( void *arg ){ 初始化 …… while ( …… ) { recv( iConnectSocketFD, amp。CommandPack, NET_COMMANDPACKSIZE, 0 )。 // 接收指令 if ( 接收錯誤 ) { if ( 服務端尚未超時 ) { 再次嘗試接收 } 服務端超時 if ( 正在遠程控制 ) { 關閉圖像發(fā)送線程 } if ( 正在屏幕廣播 ) { 關閉圖像接收線程 } 關閉連接。 多次嘗試重新建立連接 if ( 發(fā)生致命錯誤 ) { 重啟計算機 } } 每隔一段時間通知教師端:學生端仍處于活動狀態(tài)(用于超時檢測) switch ( ) { // 根據(jù)教師端發(fā)來的指令做相應的操作 …… } }} 控制指令教師端與學生端使用控制指令進行通信,這些指令在網(wǎng)絡上傳送時與它們在控制指令隊列里的數(shù)據(jù)結構有些不同,附帶數(shù)據(jù)最多只有一個,其數(shù)據(jù)結構如下:typedef struct tagCOMMANDPACK{ guint32 ui32CommandPackLen。 // 指令的字節(jié)長度 gint32 iCommand。 // 指令類型標識 union { guchar pucDataBuff[256 8]。 CLIENTINFO ClientInfo。 // 學生登錄信息 SCREENAREA ScreenAreaToShow。 // 顯示圖像大小 SCREENAREA ScreenAreaToShot。 // 截屏大小 MOUSEEVENT Mouse。 // 鼠標事件 KEYEVENT Key。 // 鍵盤事件 } Data。 // 附帶數(shù)據(jù)} COMMANDPACK, *PCOMMANDPACK。下面具體介紹一下相關指令及其附帶數(shù)據(jù):教師端發(fā)送的控制指令COMMAND_RECVHSCRN_START 開始接收圖像COMMAND_RECVSCRN_END 結束接收圖像COMMAND_SENDHSCRN_START 開始發(fā)送圖像COMMAND_SENDSCRN_END 結束發(fā)送圖像COMMAND_POWEROFF 關機COMMAND_REBOOT 重啟COMMAND_MOUSE 鼠標事件COMMAND_KEYBOARD 鍵盤事件COMMAND_ENQUIRY 通知學生端:教師端仍處于活動狀態(tài)其中:COMMAND_RECVHSCRN_START附帶顯示圖像的大小COMMAND_SENDHSCRN_START附帶抓屏的大小它們的數(shù)據(jù)結構為:typedef struct tagSCREENAREA{ guint16 ui16Width。 // 寬 guint16 ui16Height。 // 高} SCREENAREA, *PSCREENAREA。COMMAND_MOUSE附帶鼠標事件,其數(shù)據(jù)結構為:typedef struct tagMOUSEEVENT{ guint16 ui16X。 // 鼠標X坐標 guint16 ui16Y。 // 鼠標Y坐標 guint16 ui16Event。 // 鼠標事件信息 guint16 ui16Reserved。 // 保留} MOUSEEVENT, *PMOUSEEVENT。鼠標事件信息定義了以下幾種:define MOUSE_LEFTPRESS 0x01 // 左鍵按下define MOUSE_LEFTRELEASE 0x02 // 左鍵放開define MOUSE_RIGHTPRESS 0x03 // 右鍵按下define MOUSE_RIGHTRELEASE 0x04 // 右鍵放開define MOUSE_MOVE 0x06 // 鼠標移動COMMAND_ KEYBOARD附帶鍵盤事件,其數(shù)據(jù)結構為:typedef struct tagKEYEVENT{ guint16 ui16KeyCode。 // 按鍵掃描碼 guint16 ui16Event。 // 按鍵事件信息} KEYEVENT, *PKEYEVENT。按鍵事件信息定義了以下幾種:define KEY_PRESS
點擊復制文檔內(nèi)容
化學相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1