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

正文內(nèi)容

畢業(yè)設(shè)計-基于linux下網(wǎng)絡(luò)聊天室的設(shè)計與實(shí)現(xiàn)-在線瀏覽

2025-02-03 02:13本頁面
  

【正文】 執(zhí)行不同的任務(wù)。在 Linux 下編寫并調(diào)試服務(wù)器端程序和客戶端程序 ,實(shí)現(xiàn)了客戶、服務(wù)器之間的連接和通信??傮w來說,此設(shè)計以嵌入式 C 語言為開發(fā)語言,使用網(wǎng)絡(luò)套接字 socket 建立連接, 并運(yùn)行多線程實(shí)現(xiàn)數(shù)據(jù)交換,程序經(jīng) GCC 調(diào)試成功,可以在單機(jī)網(wǎng)絡(luò)中使用。 the linux。 網(wǎng)絡(luò)編程可以做如下工作:網(wǎng)絡(luò)安全,通訊設(shè)備研發(fā),協(xié)議分析 , 網(wǎng)絡(luò)管理系統(tǒng) 等 。 優(yōu)點(diǎn) Linux 作為一個開源的操作系統(tǒng) Linux 的許多特性有利于網(wǎng)絡(luò)編程。其次 Linux 秉承了 UNIX 的設(shè)備無關(guān)性這一優(yōu)秀特征,即它通過文件的描述符實(shí)現(xiàn)了統(tǒng)一的設(shè)備接口,網(wǎng)絡(luò)的 Socket 數(shù)據(jù)傳輸是一種特殊的 I/ 0 Scoket 也是一種文件描述符。 Socket 接口是一個通用的接口,它不僅支持各種網(wǎng)絡(luò)工作形式還是一個交互式通訊機(jī)制。套接字可以被看做一 個專門的管道,但又不像管道,套接字對它們能容納的數(shù)量沒有限制,且 Linux 支持多種類型的套接字。 Tcp/ip 這個種網(wǎng)絡(luò)協(xié)議是 inter 的基礎(chǔ)協(xié)議。socket 通訊所采用的協(xié)議分為面向連接和面向非連接兩種,由于 UDP盡最大努力但提供不可靠的服務(wù) UDP 算法可以 在本地網(wǎng)絡(luò)條件好的環(huán)境中良好工作,但在環(huán)境較復(fù)雜的網(wǎng)絡(luò)中就不能正常工作了,必須通過超時和重傳來實(shí)現(xiàn)可靠性,而 TCP 則提供了數(shù)據(jù)傳輸?shù)耐耆煽啃?,因此選擇 TCP 通信協(xié)議更可靠些。它具備的基本功能包括注冊、登陸、一對一私聊、查看在線人數(shù)等。 客戶端:主要用于查看在線人數(shù)、發(fā)送信息給特定用戶等功能, 總體設(shè)計 本聊天室系統(tǒng)采用了 c/s 形式。首先要存儲客戶的個人資料,相當(dāng)于注冊。當(dāng)然,服務(wù)器還有自己的動態(tài)數(shù)據(jù)處理。而鏈接客戶又分為登陸客戶和未登陸客戶,這就通過修改鏈表上客戶的名字。它是一套以 GPL 及 LGPL 許可證所發(fā)行的自由軟件,也是 GNU 計劃的關(guān)鍵部分,亦是自由的類 Unix 及蘋果電腦 Mac OS X 操作系統(tǒng) 的標(biāo)準(zhǔn)編譯器。 GCC 很快地擴(kuò)展,變得可處理 C++。 GCC 執(zhí)行過程 雖然我們稱 Gcc 是 C 語言的編譯器,但使用 gcc 由 C 語言源代碼文件生成可執(zhí)行文件 的過程不僅僅是編譯的過程,而是要經(jīng)歷四個相互關(guān)聯(lián)的步驟 ∶ 預(yù)處理 (也稱 預(yù)編譯 , Preprocessing)、 編譯 (Compilation)、 匯編 (Assembly)和鏈接 (Linking)。接著調(diào)用 cc1進(jìn)行編譯,這個階段根據(jù)輸入文件生成以 .o 為后綴的目標(biāo)文件。當(dāng)所有的目標(biāo)文件都生成之后, gcc 就調(diào)用 ld來完成最后 的關(guān)鍵性工作,這個階段就是連接。 GCC 基本使用方法 在使用 Gcc 編譯器的時候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱。 GCC 最基本的用法是 ∶gcc [options] [filenames] 6 其中 options 就是編譯器所需要的參數(shù), filenames 給出相關(guān)的文件名稱。 o output_filename,確定輸出文件的名稱為 output_filename,同時這個名稱不能和源文件同名。 g,產(chǎn)生符號調(diào)試工具 (GNU 的 gdb)所必要的符號資訊,要想對源代碼進(jìn)行調(diào)試,我們就必須加入這個選項(xiàng)。 O2,比 O更好的優(yōu)化編譯、連接,當(dāng)然整個編譯、連接過程會更慢。 C程序中的頭文件包含兩種情況 ∶ A)include B)include “” 其中, A 類使用尖括號 ( ), B 類使用雙引號 (“ ”) 。 GNU Makefile Makefile 簡介 makefile 關(guān)系到了整個工程的編譯規(guī)則。 makefile帶來的好處就是 —— “自動化編譯”,一旦 寫好,只需要一個 make 命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率??梢?, makefile 都成為了一種在工程方面的編譯方法。 prerequisites 就是,要生成那個 target 所需要的文件或是目標(biāo)。(任意的 Shell 命令 ) 這是一個文件的依賴關(guān)系,也就是說, target 這一個或多個的目標(biāo)文件依賴于 prerequisites中的文件,其生成規(guī)則定義在 mand 中。這就是 Makefile 的規(guī)則。 GDB 調(diào)試 用 gdb 調(diào)試 GCC 程序 為調(diào)試編譯代碼 (Compiling Code for Debugging) gdb 正常工作 , 你必須使你的程序在編譯時包含調(diào)試信息。 gdb 利用這些信息使源代碼和機(jī)器碼相關(guān)聯(lián)。 gdb 基本命令 gdb 支持很多的命令使你能實(shí)現(xiàn)不同的功能。如 file 裝入想要調(diào)試的可執(zhí)行文件。 list 執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部。 step 執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部。 quit 終止 gdb。 break 在代碼里設(shè)置斷點(diǎn) , 這將使程序執(zhí)行到這里時被掛起。 shell 使你能不離開 gdb 就執(zhí)行 UNIX shell 命令。你能象在 bash 或 tcsh 里那樣按 Tab 鍵讓 gdb 幫你補(bǔ)齊一個唯一的命令 , 如果不唯一的話 gdb 會列出所有匹配的命令你也能用光標(biāo)鍵上下翻動歷史命令。線程是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個進(jìn)程的資源,如文件描述和信號處理。一個進(jìn)程可以有多個線程,也就 是有多個線程控制表及堆棧寄存器,但卻共享一個用戶地址空間。 所需頭文件 include 函數(shù)原型 void pthread_exit(void *retval) 函數(shù)傳入值 retval:pthread_exit()調(diào)用 者線程的返回值,可由其他函數(shù)如pthread_join 來檢索獲取 等待線程退出并釋放資源 pthread_join() 所需頭文件 include 函數(shù)原型 int pthread_join ((pthread_t th, void **thread_return)) 函數(shù)傳入值 th:等待線程的標(biāo)識符 9 thread_return:用戶定義的指針,用來存儲被等待線程的返回值(不為 NULL時) 函數(shù)返回值 成功: 0 出錯: 1 線程數(shù)據(jù)處理 線程數(shù)據(jù)處理和進(jìn)程相比,線程的最大優(yōu)點(diǎn)之一是數(shù)據(jù)的共享性,各個進(jìn)程共享父進(jìn)程處沿襲的數(shù)據(jù)段,可以方便的獲得、修改數(shù)據(jù)。我們必須當(dāng)心有多個不同的進(jìn)程訪問相同的變量。在函數(shù)中聲明的靜態(tài)變量常常帶來問題,函數(shù)的返回值也會有問題。在進(jìn)程中共享的變量必須用關(guān)鍵字 volatile 來定義,這是為了防止編譯器在優(yōu)化時(如 gcc 中使用 OX參數(shù))改變它們的使用方式。 基于 linux 的 socket 網(wǎng)絡(luò)編程 端口和套接口 若一臺主機(jī)上同時有多個應(yīng)用程序運(yùn)行,他們都有可能使用 TCP 或 UDP協(xié)議進(jìn)行通信,則傳輸層協(xié)議收到數(shù)據(jù)后如何區(qū)分?jǐn)?shù)據(jù)是傳給哪一個應(yīng)用程序的呢?為此引用了端口和套接口。 套接口: IP 地址與端口號的組合,用來標(biāo)識全網(wǎng)范圍內(nèi)的唯一一個端口,在 TCP 協(xié)議中用來標(biāo)識一個連接。常用的 Socket 類型有三種:流式套接口、數(shù)據(jù)報式套接口和原始套接口。 TCP/IP 協(xié)議模型及 各層所用協(xié)議 如圖所示。應(yīng)用程序中使用套接字來調(diào)用套接口,套接字可認(rèn)為是指向套接口的指針,就像文件描述符是指向文件的指針一樣。一般來說,該套接字(文件描述符號)是系統(tǒng)當(dāng)前可用的,并且是數(shù)值最小的整型描述符;端口號是客戶應(yīng)用程序中一般不認(rèn)為指定, 而在服務(wù)器應(yīng)用程序中必須指定,以為服務(wù)器應(yīng)用程序要在某個固定端口上監(jiān)聽。 struct sockaddr { unsigned short sa_family。 /* 14 字節(jié)的協(xié)議地址 */ }。 sa_data 則包含該 socket 的 IP地址和端口號。 /* 地址族 */ unsigned short int sin_port。 /* Inter 地址 */ unsigned char sin_zero[8]。 指向 sockaddr_in 的指針和指向 sockaddr 的指針可以相互轉(zhuǎn)換,這意味著如果一個函數(shù)所需參數(shù)類型是 sockaddr 時,你可以在函數(shù)調(diào)用的時候?qū)⒁粋€指向 sockaddr_in 的指針轉(zhuǎn)換為指向 sickaddr 的指針;或者相反。sin_port 和 sin_sddr 應(yīng)該轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)優(yōu)先順序; struct in_addr 其定義如下: struct in_addr{ unsigned long s_addr。 如果你聲明了一個 ina 作為一個 struct sockaddr_in 的結(jié) 構(gòu),那么 就是 4個字節(jié)的 IP 地址(按網(wǎng)絡(luò)字節(jié)順序排放) 基本轉(zhuǎn)換函數(shù) 網(wǎng)絡(luò)字節(jié)順序 因?yàn)槊恳粋€機(jī)器內(nèi)部對變量的字節(jié)存儲順序不同(有的系統(tǒng)是高位在前,地位在后,而有的系統(tǒng)是低位在前,高位在后),而網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)是一定要統(tǒng)一順序的。 1. 有關(guān)的轉(zhuǎn)換函數(shù) 套接字字節(jié)轉(zhuǎn)換程序的列表: htons() —— “Host to Network Short” 主機(jī)字節(jié)順序轉(zhuǎn)換 網(wǎng)絡(luò)字節(jié)順序(對無符號短型進(jìn)行操作 4 bytes)。 ntohs() —— “Network to Host Short” 網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換為主機(jī)字節(jié)順序(對無符號短型進(jìn)行操作 4 bytes)。 2. IP 地址轉(zhuǎn)換 函數(shù) i_addr(),它能夠把一個用數(shù)字和點(diǎn)表示 IP 地址的字符串轉(zhuǎn)換成一個無符號長整型。 12 = i_addr(“”)。 socket()和 bind()函數(shù) 原型: int socket(int domain,int type, int protocol). 功能:創(chuàng)建指定類型的套接口并返回套接口描述符。 type指定套接口的類型,為 SOCK_STREAM、 SOCK_DGRAM 或 SOCK_RAW。 原型: int bind(int sockfd, struct sockaddr *my_addr ,int addrlen). 功能:使套接口與 IP地址和端口號綁定。 /*系統(tǒng)隨機(jī)選 擇一個未被使用的端口號 */ = INADDR_ANY; /*填入本機(jī) IP 地方 */ 原型: close(sockfd)。 說明: sockfd 是一個要關(guān)閉的套接字。 功能:用來與遠(yuǎn)端服務(wù)器建立一個 TCP 連接。 原型: int listen(int sockfd, int backlog)。 參數(shù)說明: sockfd 是 socket()系統(tǒng)調(diào)用返回的 socket 描述符; backlog 13 指定在請求隊(duì)列中允許的最大請求數(shù),進(jìn)入的連接請求將在隊(duì)列中等待被accept()。 功能:接受連接隊(duì)列的服務(wù)請求,并返回一個新的 socket 描述符,來供這個新連接來使用。 返回值:整型套接口描述符。例如 Web 服務(wù)器在 80 號端口監(jiān)聽,當(dāng)有客戶向80號端口發(fā)出連接請求時 (如 圖 3- 2 所示) ,服務(wù)器將接受請求且由服務(wù)器進(jìn)程派生出子進(jìn)程和新的套接口(由 accept()的返回值指向)來與客戶連接并通信 (如 圖 所示) 。大致流程如下: 客戶端向服務(wù)器發(fā)送一個 SYN J 服務(wù)器向客戶端響應(yīng)一個 SYN K,并對 SYN J 進(jìn)行確認(rèn) ACK J+1 客戶端再想服務(wù)器發(fā)一個確認(rèn) ACK K+1 只有就完了三次握手,但是這個三次握手發(fā)生在 socket 的那幾個函數(shù)中呢? 如 圖: Listenfd Client client Listenfd connfd 14 、 socket 中 TCP 的四次握手釋放連接詳解 上面介紹了 socket 中 TCP 的三次握手建立過程,及其涉及的 socket 函數(shù)。它的接收也作為文件結(jié)束符傳遞給應(yīng)用進(jìn)程,因?yàn)?FIN的接收意味著應(yīng)用進(jìn)程在相應(yīng)的連接上再也接收不到額外數(shù)據(jù);一段時間之后,接收到文件結(jié)束符的應(yīng)用進(jìn)程調(diào)用 close 關(guān)閉它的 socket。這樣每個方向上都有一個 FIN 和 ACK 15 第五 章 linux 下 socket 編程實(shí)現(xiàn)過程 聊天室 socket 編譯鏈接過程 1 監(jiān)聽鏈接 利用 socket, bind, listen 建立鏈接,步驟是: (1) 先利用 socket 函數(shù)處事話 socket 端口,獲得 sock_fd(一種文件描述符)。 (2) IP 地址及其處理過程詳見上一章。 (4) 利用 listen 函數(shù)監(jiān)聽。 3 主機(jī)接受請求通信開始 ( 1) 主機(jī)利用 accept 接收請求 ( 2) 創(chuàng)建子進(jìn)程,顯示出聊天室界面 ( 3) 接收返回信息,顯示鏈接成功,并退出鏈接。 4 詳細(xì)流程圖 : 16 具體操作 (1)在 Linux 的 VI 編輯器下編寫服務(wù)器端程序 serv. c 和客戶端程序 。 其 makefile 指令為: CC := gcc CFLAGS += w g O O2 O3 o RM := rm rf *~
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1