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

正文內(nèi)容

基于linux操作系統(tǒng)的聊天軟件的設(shè)計畢業(yè)設(shè)計說明書(編輯修改稿)

2025-04-03 09:56 本頁面
 

【文章內(nèi)容簡介】 簡單,速度很快 ,缺點也由于 這個原因?qū)е峦綇?fù)雜 ;雖然 占用內(nèi)存少,切換簡單, 但是 CPU 利用率高 , 編程復(fù)雜,調(diào)試復(fù)雜 ; 一個線程 死掉 將導(dǎo)致整個進程 失去功能。 通過以上兩種方案的比較 ,考慮適用性,選擇多線程實現(xiàn)對客戶端的監(jiān)聽。 I/O 多路復(fù)用 除了可以采用多進程和多線程方法去實現(xiàn)并發(fā)情況之外,還可以采用 I/O 多路復(fù)用這門技術(shù)來實現(xiàn)。通過該技術(shù),系統(tǒng)內(nèi)核首先會緩沖 I/O 數(shù)據(jù),當某個 I/O 準備好后,系統(tǒng)自動通知相應(yīng)的應(yīng)用程序去完成 I/O讀或?qū)懖僮?,這樣應(yīng)用程序可以迅速的完成對應(yīng)的 I/O操作,因而系統(tǒng)不需要等待完成相應(yīng) I/O 操作,從而應(yīng)用程序設(shè)置阻塞。 因此我在收發(fā)信息方面使用了 I/O 多路復(fù)用去處理,即在處理群聊私聊的信息傳送時。對于 client 端,一旦我們輸入了一行文字發(fā),系統(tǒng)會 自動的讀取,進而發(fā)送給系統(tǒng)內(nèi)的server 端,然后由 server 端反饋給對應(yīng)的目標 client 端。 方案一:當我們使用的 poll 函數(shù) 返回時,會 返回 一個文件是讀寫標志,應(yīng)用程序根據(jù)不同的 返回 標志 去 讀寫相應(yīng)的文件,實現(xiàn) 不用阻塞就可以完成 讀寫。 這 允許進程來決定 那個client 端 是可讀或?qū)懸粋€或多個文件而不 用 阻塞 的 。 poll 返回不同的標志, 這些標志 告訴主進程文件是否可以讀寫,其原型(定義在 linux\ ) : unsigned int (*poll) (struct file *filp, poll_table *wait)。 實現(xiàn)這個設(shè)備 的 方法分 為下面的 兩步 : 1. 在一個或多個可指示查詢狀態(tài)變化的等待隊列上調(diào)用 poll_wait. 當 文件描述符 不可以 可用來執(zhí)行 I/O 時 , 內(nèi)核 將使 這個進程在 處于等待狀態(tài),一旦又來可使用的文件描述符時, . 驅(qū)動 自動的 通過調(diào)用函數(shù) poll_wait 增加一個 新的 等待隊列到 poll_table 結(jié)構(gòu),原型 : void poll_wait (struct file *, wait_queue_head_t *, poll_table *)。 2. 返回一個位掩碼: 我們在處 理某一些功能時 不必 要 阻塞 ,需要 立刻進行的操作, 那么我們就需要下面的 幾個標志 (通過 linux/ 定義 )用來指示可能的操作 ,如表 21 所示: 標志 含義 POLLIN 如果設(shè)備無阻塞的讀,就返回該值 POLLRDNORM 通常的數(shù)據(jù)已經(jīng)準備好,可以讀了,就返回該值。通常的做法是會返回( POLLLIN|POLLRDNORA) POLLRDBAND 如果可 以從設(shè)備讀出帶外數(shù)據(jù),就返回該值,它只可在 linux 內(nèi) 核的某些網(wǎng)絡(luò)代碼中使用,通常不用在設(shè)備驅(qū)動程序中 POLLPRI 如果可 以無阻塞的讀取高優(yōu)先級(帶外)數(shù)據(jù),就返回該值,返回該值會導(dǎo)致 select 報告文件發(fā)生異常,以為 select 八帶外數(shù)據(jù)當作異常處理 POLLHUP 當讀設(shè) 備的進程到達文件尾時,驅(qū)動程序必須返回該值,依照 select 的功能描述,調(diào)用 select 的進程被告知進程時可讀的。 POLLERR 如果設(shè) 備發(fā)生錯誤,就返回該值。 POLLOUT 如果設(shè)備可以無阻塞地些,就返回該值 POLLWRNORM 設(shè)備已經(jīng)準備好,可以寫了,就返回該值。通常地做法是( POLLOUT|POLLNORM) POLLWRBAND 于 POLLRDBAND 類似 表 21 poll函數(shù)返回的位掩碼及其含義 方案二: select 函數(shù): select()函數(shù)的接口主要 以 39。fd_set39。類型 為 基礎(chǔ) 而建立的 。 39。fd_set)是一組文件描述符 (fd)的 大 集合。由于 在不同的平臺上 fd_set 類型的長度 是 不同 的 ,因此 規(guī)定用一組標準的宏定義來處理此類變量 顯得尤其重要 : fd_set set。 FD_ZERO(amp。set)。 FD_SET(fd, amp。set)。 FD_CLR(fd, amp。set)。 FD_ISSET(fd, amp。set)。 在過去,一個 fd_set 通常是小于 32 個文件描述符 的 ,因為 fd_set 其實 僅僅使用 了一個int 的比特矢量來實現(xiàn) 它。 在大多數(shù)情況下系統(tǒng)的責任 之一包括 檢查 fd_set 能包括任意值的文件描述符, 但是當我們知道我們的文件描述符的多少時 你應(yīng)該檢查 /修改宏 FD_SETSIZE的值。這個值是 與 系統(tǒng)相關(guān)的,同時 我們也要 檢查 Linux 系統(tǒng)中的 自帶的 select() 的 man 手冊。 因為 有一些系統(tǒng)對多于 1024 個文件描述符的 fd_set 是存在 支持 的問 題 的 。 [譯者注: Linux 就是這 樣的系統(tǒng)!你會發(fā)現(xiàn) sizeof(fd_set)的結(jié)果是 128(*8 = FD_SETSIZE=1024) 盡管很少你會遇到這種情況。 select 的基本接口 其實是非常的 簡單 的 : int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout)。 其中: nfds 需要檢查的文件描述符個數(shù),數(shù)值應(yīng)該比是三組 fd_set 中最大數(shù) 更大,而不是實際文件描述符的總數(shù)。 readset 用來檢查可讀性的一組文件描述符。 writeset 用來檢查可寫性的一組文件描述符。 exceptset 用來檢查意外狀態(tài)的文件描述符。 (注:錯誤并不是意外狀態(tài) ) timeout NULL 指針代表 一直 等待,否則是指向 timeval 結(jié)構(gòu)的指針,代表最 長等待時間。 (如果其中 tv_sec 和 tv_usec 都等于 0, 則文件描述符 的狀態(tài)不被影響,但函數(shù)并不掛起 ) 函數(shù)將返回響 應(yīng)操作的 總的響應(yīng)了的 描述符,且三組數(shù)據(jù)均在恰當位置被修改,只有響應(yīng)操作的那一些沒有修改。接著應(yīng)該用 FD_ISSET 宏來查找返回的文件描述符組。 通過以上兩種方案的比較,考慮適用性,選擇調(diào)用 poll 函數(shù)實現(xiàn) I/O 多路復(fù)用。 3 系統(tǒng)實現(xiàn) Linux 提供的有關(guān) Socket 的系統(tǒng)調(diào)用 (1) Socket() 作用: socket 函數(shù)為 client 端 或 server 端 創(chuàng)建一個 sokcet 套接字 格式: int socket(int family,int type,int protocol)。 參數(shù)說明: family:表示地址族 ( IP地址) ,可以去 AF_UNLX 和 AF_INT。 其中, AF_UNLX 只能夠用于 UNIX 系統(tǒng)進程間通信 。AF_INT 是 可以用于 Inter 的,因而可以允許在遠程主機之間通信,實驗中使用 AF_INT。 Type:網(wǎng)絡(luò)程序所采用的通信協(xié)議,可以取 SOCK_STREAM 或 SOCK_DGRAM。其中, SOCK_STREAM 表明使用的是 TCP 協(xié)議,; SOCKE_DGRAM 表明使用的是 UDP 協(xié)議。 (2) bind( ) 格式: int bind(int sockfd,struct sockaddr *addr,int addrlen)。 參數(shù)說明: Sockfd: socket套接字的的文件描述符。 Sockaddr: IP 地址和端口 Addrlen:設(shè)置結(jié)構(gòu)大小長度。 (3) listen() 格式: int listen(int sockfd, int backlog)。 作用:監(jiān)聽。 參數(shù)說明: Sockfd:表示調(diào)用返回的文件描述符。 backlog:表示接入隊列允許的連接數(shù)目。 (4) accept() 格式: Int accept (int sockfd, void *addr, int *addrlen)。 作用:與 listen 函數(shù)合用,監(jiān)聽信息、接收 client 端請求。 參數(shù)說明: sockfd:表示 socket 的文件描述符。 addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu) struct sockaddrin的指針。 addrlen:表示地址的長度。 (5) connect() 格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen)。 作用:在面向連接的系統(tǒng)中 client 端連接 server 端時使用, connect 必須在 bind 后使用。 參數(shù)作用: sockfd:表示 socket 的文件描述符。 servaddr:表示村訪目的端口和 ip 地址(套接字)的數(shù)據(jù)結(jié)構(gòu)。 (6) send() 和 recv() 格式 1: int send (int sockfd, const vod *msg,int len, int flags)。 功能:發(fā)送信息。 格式 2: int recv (int sockfd , void *buf,int len, usigned int flags)。 作用:用于流式 socket、數(shù)據(jù)報 socket 內(nèi)部之間的通信。 close() 和 shutdown() 格式: close( int sockfd) 或 int shutdown(int sockfd , int how)。 參數(shù)說明: How的值為下面一種: 0不允許繼續(xù)接收; 1不允許繼續(xù)發(fā)送; 2不允許繼續(xù)發(fā)送和接收。 (7) 有關(guān)線程的系統(tǒng)調(diào)用函數(shù) pthread_create()、 pthread_detach() 實驗過程說明(使用 TCP/IP) (1) 監(jiān)聽連接 利用 socket、 bind、 listen 建立連接,步驟是: 1) 先用 socket 函數(shù)初始化 socket,創(chuàng)建新的 sockfd。 Sockfd = socket( AF_INT, SOCK_STREAM,0) 2) 此步驟涉及到 IP 地址及其處理過程。 參數(shù)說明: i_addr 函數(shù) INADDR_ANY 該函數(shù)把由小數(shù)點分開的十進制 IP 地址轉(zhuǎn)為 unsinged long 類型,而在實驗中所使用的為INADDR_ANY,使用利用自已的 IP 地址自動填充。 a) 利用 bind 函數(shù)綁定端口和 IP 地址。 =AF_INET。 /*將地址族類型設(shè)定好 */ =htons(MYPORT) 。 /* 將端口給其賦值 */ =INADDR_ANY。 /*用連接地址自動填充 ip*/ Bind(sockfd,(stuct sockaddr*)amp。my_addr,sizeof(stuct sockaddr))。 /*sockfd 是分配的 socket 名字, myaddr 則便是分配好的端口與 IP,用 bind 綁定 */ b) 利用 listen 監(jiān)聽請求 (2) 發(fā)送請求 1) 先用 socket 函數(shù)初始化 socket,創(chuàng)建新的 sockfd。 2)初始化要連接的服務(wù)器地址。 3)利用 connect 函數(shù)將自己的 IP 地址等信息發(fā)送到主機,等待主機調(diào)用 accept 函數(shù)來接受請求。 (3) 主機接收請求,進行數(shù)據(jù)通信 1)主機利用 accept 接收請求。 2)創(chuàng)建子進程,顯示歡迎信息; 3)接收返回信息,顯示連接成功,并退出連接; 4)關(guān)閉客戶端口 socket; Linux 下的聊天軟件涉及的一個 server 端 和多個 client 端 .client 端向 server 端發(fā)送請求, server 端對請求作出響應(yīng) .client 端嘗試與 server 端建立連接 .一旦連接建立起來, client 端和 server 端就可以通過 socket 套節(jié)字進行通信 .本系統(tǒng)中 ,主要有兩個應(yīng)用程序 ,分別為 server 端程序和 client 端, client 端主要是用于消息轉(zhuǎn)發(fā)、客戶登陸信息的管理以及向所有用戶發(fā)送系統(tǒng)消息等。 本系統(tǒng)采用 C/S(Client/Server)體系結(jié)構(gòu)(見圖 31),即 client 端 /server 端體系結(jié)構(gòu) .其特點是 client 端 只裝載應(yīng)用軟件,消息處理、用戶監(jiān)控等復(fù)雜的處理放在 server端中實現(xiàn),這樣就可以大大簡化 client 端的代碼,增加了系統(tǒng)的穩(wěn)定性。 圖 31 C/S體系結(jié)構(gòu)圖 其大致實現(xiàn)模型是: ( 1) server 端設(shè)置一個固定的端口號 .一旦 server 端啟動 ,既使用 ListenThread 線程對端口進行不間斷監(jiān)聽 .如果 client 端請求一個連接, server 端使用 accept()方法打開一個 socket 連接 . ( 2)客戶在 host 和 port 端口建立連接 . ( 3) server 端和 client 端使用 Inp
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1