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

正文內(nèi)容

基于linux網(wǎng)絡(luò)聊天室-畢業(yè)設(shè)計(jì)論文-資料下載頁(yè)

2024-11-23 16:06本頁(yè)面

【導(dǎo)讀】基于資源共享和軟件自由的思想,linux成為越來(lái)越多技術(shù)人員的理想之國(guó)。任網(wǎng)絡(luò)構(gòu)建和維護(hù)。出于對(duì)unix技術(shù)優(yōu)勢(shì)的出色繼承和延續(xù),linux對(duì)多種網(wǎng)絡(luò)協(xié)議的。支持使得網(wǎng)絡(luò)解決方案極大的豐富。在Linux中的網(wǎng)絡(luò)編程是通過(guò)socket接口來(lái)進(jìn)行的,Socket是TCP/IP網(wǎng)絡(luò)的API。但是一種特殊的I/O,它也是一種文件描述符。socket有TCP和UDP兩個(gè)協(xié)議,TCP協(xié)議。有數(shù)據(jù)的可靠性、應(yīng)用的實(shí)時(shí)性、網(wǎng)絡(luò)的可靠性三個(gè)優(yōu)點(diǎn)。因此選擇TCP協(xié)議更為可靠。本系統(tǒng)實(shí)現(xiàn)了在Linux網(wǎng)絡(luò)聊天室的基本功能。在Linux下編寫并調(diào)試服務(wù)器端程。序和客戶端程序,實(shí)現(xiàn)了客戶、服務(wù)器之間的連接接和通信。口分別運(yùn)行客戶、服務(wù)器端的程序,或者兩臺(tái)主機(jī)鏈接分別作為客戶和服務(wù)器的方式。用多線程實(shí)現(xiàn)數(shù)據(jù)的交換,程序經(jīng)gcc調(diào)試成功,可以在單機(jī)網(wǎng)絡(luò)聊天中使用。

  

【正文】 畢業(yè) 論文 ) 18 struct sockaddr { unsigned short sa_family。 /*地址族 */ char sa_data[14]。 /*14 字節(jié)的協(xié)議地址,包含該 socket 的 IP 地址和端口號(hào)。 */ }。 struct sockaddr_in { short int sa_family。 /*地址族 */ unsigned short int sin_port。 /*端口號(hào) */ struct in_addr sin_addr。 /*IP 地址 */ unsigned char sin_zero[8]。 /*填充 0 以保持與 struct sockaddr 同樣大小 */ }。 這兩個(gè)數(shù)據(jù)類型是等效的,可以相互轉(zhuǎn)化,通常 sockaddr_in 數(shù)據(jù)類型使用更為方便。在建立 socketadd 或 sockaddr_in 后,就可以對(duì)該 socket 進(jìn)行適當(dāng)?shù)牟僮髁恕? (2)結(jié)構(gòu)字段 表 列出了該結(jié)構(gòu) sa_family 字段可選的常見(jiàn)值。 表 sa_family 字段 結(jié)構(gòu)定義頭文件 include i/ Sa_family AF_INET: IPv4 協(xié)議 AF_INET6: IPv6 協(xié)議 AF_LOCAL: UNIX 域協(xié)議 AF_LINK:鏈路地址協(xié)議 數(shù)據(jù)存儲(chǔ)優(yōu)先順序 (1)函數(shù)說(shuō)明 計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。 Inter 上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸,因此在有些情況下,需要對(duì)這兩個(gè)字節(jié)存儲(chǔ)優(yōu)先順序進(jìn)行相互轉(zhuǎn)化。這里用到了四個(gè)函數(shù): htons、 ntohs、 htonl、 ntohl。這四個(gè)地址分別實(shí)現(xiàn)網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的轉(zhuǎn)化,這里的 h 代表 host, n 代表 work, s 代表 short, l 代表 long。通常 16 位的 IP 端口號(hào)用 s 代表,而 IP 地址用 l 來(lái)代表。 (2)函數(shù)格式說(shuō)明 表 列出了這 4 個(gè)函數(shù)的語(yǔ)法格式。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 19 表 htons 等函數(shù)語(yǔ)法要點(diǎn) 所需頭文件 include i/ 函數(shù)原型 uint16_t htons(unit16_t host16bit) uint32_t htonl(unit32_t host32bit) uint16_t ntohs(unit16_t 16bit) uint32_t ntohs(unit32_t 32bit) 函數(shù)傳入值 host16bit:主機(jī)字節(jié)序的 16bit 數(shù)據(jù) host32bit:主機(jī)字節(jié)序的 32bit 數(shù)據(jù) 16bit:網(wǎng)絡(luò)字節(jié)序的 16bit 數(shù)據(jù) 32bit:網(wǎng)絡(luò)字節(jié)序的 32bit 數(shù)據(jù) 函數(shù)返回值 成功:返回要轉(zhuǎn)換的字節(jié)序 出錯(cuò): 注意 :調(diào)用該函數(shù)只是使其得到相應(yīng)的字節(jié)序,用戶不需清楚該系統(tǒng)的主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序是否真正相等。如果是相同不需要轉(zhuǎn)換的話,該系統(tǒng)的這些函數(shù)會(huì)定義成空宏。 地址格式轉(zhuǎn)化 (1)函數(shù)說(shuō)明 通常用戶在表達(dá)地址時(shí)采用的是點(diǎn)分十進(jìn)制表示的數(shù)值 (或者是以冒號(hào)分開(kāi)的十進(jìn)制 IPv6 地址 ),而在通常使用的 socket 編程中所使用的則是二進(jìn)制值,這就需要將這兩個(gè)數(shù)值進(jìn)行轉(zhuǎn)換。這里在 IPv4 中用到的函數(shù)有 i_aton、 i_addr 和 i_ntoa,而 IPv4 和 IPv6 兼容的函數(shù)有 i_pton 和 i_ntop。由于 IPv6 是下一代互聯(lián)網(wǎng)的標(biāo)準(zhǔn)協(xié)議,因 此本系統(tǒng)使用 IPv4 為例 協(xié)議 。這里 i_pton 函數(shù)是將點(diǎn)分十進(jìn)制地址映射為二進(jìn) 制地址,而 i_ntop 是將二進(jìn)制地址映射為點(diǎn)分十進(jìn)制地址。 (2)函數(shù)格式 表 列出了 i_pton 函數(shù)的語(yǔ)法要點(diǎn)。 表 i_pton函數(shù)語(yǔ)法要點(diǎn) 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 20 所需頭文件 include arpa/ 函數(shù)原型 int i_pton(int family,const char *strptr, void *addrptr) 函數(shù)傳入值 Family AF_INET: IPv4 協(xié)議 AF_INET6: IPv6 協(xié)議 strptr:要轉(zhuǎn)化的值 addrptr:轉(zhuǎn)化后的地址 函數(shù)返回值 成功: 0 出錯(cuò): 1 表 列出了 i_ntop 函數(shù)的語(yǔ)法要點(diǎn)。 表 i_ntop 函數(shù)語(yǔ)法要點(diǎn) 所需頭文件 include arpa/ 函數(shù)原型 int i_ntop(int family, void *addrptr, char *strptr, size_t len) 函數(shù)傳入值 family AF_INET6: IPv6 協(xié)議 AF_INET: IPv4 協(xié)議 addrptr:轉(zhuǎn)化后的地址 strptr:要轉(zhuǎn)化的值 Len:轉(zhuǎn)化后值的大小 函數(shù)返回值 成功: 0 出錯(cuò): 1 連 接函數(shù)的說(shuō)明 連 接的流程圖 在客戶 /服務(wù)器模型中,多個(gè)相互通信的計(jì)算機(jī)都作為客戶端,與網(wǎng)絡(luò)服務(wù)器進(jìn)行連接,并通過(guò)服務(wù)器進(jìn)行信息的傳遞。所以多個(gè)客戶端之間的通信就變?yōu)榱丝蛻舳伺c服務(wù)端的通信。所以,采用客戶 /服務(wù)器模型進(jìn)行網(wǎng)絡(luò)聊天需要分別編寫服務(wù)器端和客戶端的程序,服務(wù)器和客戶端之間相互通信的同步關(guān)系和各自的程序流程如實(shí)驗(yàn)圖 所示。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 21 圖 使用 TCP 協(xié)議 socket 編程流程圖 函數(shù)格式 (1)Socket() 作用: socket 函數(shù)為客戶機(jī)或服 務(wù)器創(chuàng)建一個(gè) sokcet 格式: int socket(int family,int type,int protocol)。 參數(shù)說(shuō)明: Family:表示地址族,可以去 AF_UNLX 和 AF_INT。 其中, AF_UNLX 只能夠用于單一的 UNIX 系統(tǒng)進(jìn)程間通信 。AF_INT 是針對(duì) Inter的,因而可以允許在遠(yuǎn)程主機(jī)之間通信,實(shí)驗(yàn)中使用 AF_INT。 Type:網(wǎng)絡(luò)程序所采用的通信協(xié)議,可以取 SOCK_STREAM 或 SOCK_DGRAM。其中, SOCK_STREAM 表明使用的是 TCP 協(xié)議,這樣提供按順序的、可靠的、雙向、面向連接的比特流; SOCKE_DGRAM 表明使用的是 UDP 協(xié)議,這樣只會(huì)提供定長(zhǎng)、不可靠、無(wú)連接的通信。 (2)bind( ) 格式: int bind(int sockfd,struct sockaddr *addr,int addrlen)。 參數(shù)說(shuō)明: Sockfd: socket 的文件描述符號(hào)。 Sockaddr:表示名字所用的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)保存地址 (包括 IP 地址和端口 )。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 22 Addrlen:設(shè)置結(jié)構(gòu)大小長(zhǎng)度。 (3) listen() 格式: int listen(int sockfd, int backlog)。 作用:監(jiān)聽(tīng)連接信號(hào),和 accepted 函數(shù)合同。 參數(shù)說(shuō)明: Sockfd:表示 socket 調(diào)用返回的文件描述符。 Backlog:表示接入隊(duì)列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許 20 個(gè),也可以子定義 5~10 個(gè)。 (4) accept() 格式: Int accept (int sockfd, void *addr, int *addrlen)。 作用:與 listen 函數(shù)合用,監(jiān)聽(tīng)信息、接收客戶端請(qǐng) 求。 參數(shù)說(shuō)明: Sockfd:表示 socket 的文件描述符。 Addr:表示指向局部的數(shù)據(jù)結(jié)構(gòu) struct sockaddrin 的指針。 Addrlen:表示地址的長(zhǎng)度。 (5) connect() 格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen)。 作用:在面向連接的系統(tǒng)中客戶及連接服務(wù)器時(shí)使用, 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ù)報(bào) socket 內(nèi)部之間的通信。 (7) close( ) 格式: Close( int sockfd)。 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 23 第四章 Linux 網(wǎng)絡(luò)聊天室 socket 編程實(shí)現(xiàn)過(guò)程 聊天室 Socket 編程連接的過(guò)程 監(jiān)聽(tīng)連接 利用 socket、 bind、 listen 建立連接,步驟是: (1)先用 socket 函數(shù)初始化 socket,創(chuàng)建新的 sock_fd。 sock_fd=socket(AF_INET,SOCK_STREAM,0)。 (2)此步驟涉及到 IP 地址及其處理過(guò)程。 參數(shù)說(shuō)明: i_addr 函數(shù) INADDR_ANY 該函數(shù)把由小數(shù)點(diǎn)分開(kāi)的十進(jìn)制 IP 地址轉(zhuǎn)為 unsinged long 類型, 而在實(shí)驗(yàn)中所使用的為 INADDR_ANY,使用利用自已的 IP 地址自動(dòng)填充。 (3)利用 bind 函數(shù)綁定端口和 IP 地址。 =AF_INET。 /*將地址族類型設(shè)定好 */ =htons(port)。 /* 將端口給其賦值 */ i_pton(AF_INET,ip_buf,amp。)。 /*用連接地址自動(dòng)填充 ip*/ rst = connect(sock_fd,(void*)amp。pin,sizeof(pin))。/*sock_fd 是分配的 socket 名字, pin則便是分配好的端口與 IP,用 bind 綁定 */。 (4)利用 listen 監(jiān)聽(tīng)請(qǐng)求 listen(listen_fd,T_MAX)。 發(fā)送請(qǐng)求 (1)獲取主機(jī)信息。 (2)初始化 socket 端口。 (3)利用 connect 函數(shù)將自己的 IP 地址等信息發(fā)送到主機(jī),等待主機(jī)調(diào)用 accept 函數(shù)來(lái)接受請(qǐng)求。 主機(jī)接收請(qǐng)求,進(jìn)行數(shù)據(jù)通信 (1)主機(jī)利用 accept 接收請(qǐng)求。 (2)創(chuàng)建子進(jìn)程,顯示歡迎信息; (3)接收返回信息, 顯示連接成功,并 退 出連接; 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 24 (4)關(guān)閉客戶端口 socket 以上的過(guò)程總結(jié)為 服務(wù)器端應(yīng)用程序在一個(gè)端口監(jiān)聽(tīng)對(duì)服務(wù)的請(qǐng)求 ,也就是說(shuō) ,服務(wù) 線 程一直處于休眠狀態(tài) ,直到有一個(gè)客戶對(duì)這個(gè)服務(wù)提出了連接請(qǐng)求 ,此時(shí)服務(wù)線程被“喚醒”并為客戶提供服務(wù) ,即對(duì)客戶的請(qǐng)求做出適當(dāng)?shù)姆磻?yīng) [18 ] 。 接著自己繼續(xù)監(jiān)聽(tīng), 新建的線程執(zhí)行完畢,自動(dòng)關(guān)閉連接,釋放資源。這樣就實(shí)現(xiàn)了 socket通訊,如圖 。 服務(wù)器 客戶端 圖 單個(gè)客戶端 socket 連接 聊天室程序 設(shè)計(jì) 及界面 服務(wù)器的啟動(dòng) 首先,在命令行輸入 make 命令編譯各個(gè)文件,如下圖 所示 : Makefile 文件把系統(tǒng) 需要編譯的文件按照依賴的先后順序進(jìn)行編譯。 圖 make 編譯界面 內(nèi)蒙古科技大學(xué)畢業(yè)設(shè)計(jì) 說(shuō)明書 (畢業(yè) 論文 ) 25 其次在命令行輸入 ./serverv3, 服務(wù)器則啟動(dòng),一直等待客戶登陸為其服務(wù),直到退出為止,這樣就 屬于 日常的服務(wù)器需要維護(hù),暫不能登錄聊天室。服務(wù)器啟動(dòng)如圖 所示。 圖 服務(wù)器啟動(dòng)界面 服務(wù)器 主函數(shù) 代碼如下所示: int main() { struct sockaddr_in sin。 struct sockaddr_in pin。 int listen_fd。 int conn_fd。 socklen_t address_size=sizeof(pin)。 char str[INET_ADDRSTRLEN]。 int i=0。 int len。 int ret。 int n。 node *ptr。 pthread_t tid[T_MAX]。 //1個(gè)客戶連接生成 1個(gè) thread, 用于存放各個(gè)連接對(duì)應(yīng)的 ThreadId //signal這里則是為 了忽略來(lái)自客戶端退出時(shí)系統(tǒng)發(fā)出的自動(dòng)退出信號(hào) signal(SIGPIPE,SIG_IGN)。 signal(SIGCHLD,SIG_IGN)。 //給 head開(kāi)辟空間 head=(node *)mall
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1