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

正文內(nèi)容

基于linux的網(wǎng)絡(luò)聊天程序的開(kāi)發(fā)(參考版)

2024-11-16 15:28本頁(yè)面
  

【正文】 。//綁定端口、 IP、協(xié)議族 ERROR(ret 0,bind)。//本機(jī) IP ret = bind(sock_fd,(void *)amp。//協(xié)議族 = htons(SERV_PORT)。serv_addr,sizeof(struct sockaddr_in))。//建立套接字 ERROR(sock_fd 0,socket())。 struct sockaddr_in serv_addr。 client_t *pclient。 int ret。按組合鍵 ctrl + c 退出程序。判斷有無(wú)信息,然后判斷信息是登陸或者聊天信息。 ( 1)主機(jī)利用 accept 接收請(qǐng)求; ( 2)創(chuàng)建子進(jìn)程,顯示歡迎信息; ( 3)接收返回信息,顯示連接成功,并推出連接; ( 4)關(guān)閉客戶端口 Socket; ( 5)關(guān)閉服務(wù)端 Socket,結(jié)束子線程。 ( 3)利用 connect 函數(shù)將自己的 IP 地址等信息發(fā)送到主機(jī), 等待主機(jī)調(diào)用accept 函數(shù)來(lái)接受請(qǐng)求。 首先,發(fā)送請(qǐng)求: ( 1)利用 gethostbyname 獲取主機(jī)信息。 =AF_INET; /*將地址族類型設(shè)定好 */ =htons(MYPORT; /* 將端口給其賦值 */ =INADDR_ANY; /*用連接地址自動(dòng)填充 ip*/ Bind(sockfd,(stuct sockaddr*)amp。 參數(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)填充。 TCP/IP 的使用 監(jiān)聽(tīng)連接 , 利用 Socket、 bind、 listen 建立連接,步驟是: 第一步, 用 Socket 函數(shù)初始化 Socket,創(chuàng)建新的 sockfd。 參數(shù)說(shuō)明: How 的值為下面一種: 0不允許繼續(xù)接收; 1不允許繼續(xù)發(fā)送; 15 2不允許繼續(xù)發(fā)送和接收。 作用:用于流式 Socket、數(shù)據(jù)報(bào) Socket 內(nèi)部之間的通信。 功能:發(fā)送信息。 Servaddr:表示村訪目的端口和 ip 地址(套接字)的數(shù)據(jù) 結(jié)構(gòu)。 作用:在面向連接的系統(tǒng)中客戶及連接服務(wù)器時(shí)使用, connect 必須在 bind后使用。 Addrlen:表示地址的長(zhǎng)度。 參數(shù)說(shuō)明: Sockfd:表示 Socket 的文件描述符。 Backlog:表示接入隊(duì)列允許的連接數(shù)目,大多數(shù)系統(tǒng)允許 20 個(gè),也可以子定義 5~ 10 個(gè)。 listen( ) 格 式 : int listen(int sockfd, int backlog); 作用:監(jiān)聽(tīng)連接信號(hào),和 accepted 函數(shù)合同。 Sockaddr:表示名字所用的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)保存地址 (包括 IP 地址和端口 )。 bind( ) 格式: int bind(int sockfd,struct sockaddr *addr,int addrlen)。 Type : 網(wǎng) 絡(luò) 程 序所 采 用的 通信 協(xié) 議 , 可 以取 SOCK_STREAM 或SOCK_DGRAM。 格式: int Socket(int family,int type,int protocol); 參數(shù)說(shuō)明: Family:表示地址族,可以去 AF_UNLX 和 AF_INT。 \c :用于 shell 程序中,不換行。 \r :插入回車符。 ESC8:恢復(fù)保存的光標(biāo)位置參數(shù)及字符屬性。p; ……m 其中屬性值 p 可以是一個(gè)或多個(gè),具體定義如下: p 含義如表 所示: 表 p 的含義 應(yīng)用: unix 系統(tǒng)提供的 setcolor 命令是以行為單位改變顏色,在實(shí)際運(yùn)用中有它的局限性,上面提到的控制代碼在日常生活中用得最多,尤其適合于彩色彈出式立體菜單的設(shè)計(jì)。 五、定義字符顯示屬性代碼 代碼定義: ESC[p。 ( 2) 用 shell 編輯的菜單程序中定位光標(biāo),如: echo″^[[10。mf)。 12 四、移動(dòng)光標(biāo) 代碼定義: ESC[nA: 光標(biāo)上移 n 行 ; ESC[nB: 光標(biāo)下移 n 行 ; ESC[nC: 光標(biāo)右移 n 個(gè)字符 ; ESC[nD: 光標(biāo)左移 n 個(gè)字符 ; ESC[n。 三、插入字符代碼 代碼定義 : ESC[n: 在當(dāng)前 光標(biāo)處插入 n 個(gè)字符 ; ESC[nL: 在當(dāng)前光標(biāo)下插入 n 行。 二、刪除字符代碼 代碼定義: ESC[nX: 清除光標(biāo)右邊 n 個(gè)字符,光標(biāo)不動(dòng) ; ESC[K 或 ESC[OK: 清除光標(biāo)右邊全部字符,光標(biāo)不動(dòng) ; ESC[1K: 清除光標(biāo)左邊全部字符,光標(biāo)不動(dòng) ; ESC[2K: 清除整行,光標(biāo)不動(dòng) ; ESC[J 或 ESC[OJ: 清除光標(biāo)右下屏所有字符,光標(biāo)不動(dòng) ; ESC[1J: 清除光標(biāo)左上屏所有字符,光標(biāo)不動(dòng) ; ESC[2J 或 ESCc: 清屏,光標(biāo)移到左上角 ; ESC[nM: 刪除光標(biāo)之下 n 行,剩下行往上移,光標(biāo)不動(dòng) ; ESC[nP: 刪除光標(biāo)右邊 n 個(gè)字符,剩下部分左移,光標(biāo)不動(dòng) 。 ( 3) 在 shell 程序中用 echo 命令: echo″^[[2h字串 ″.注 Esc 鍵在 vim 編輯器中輸入方法為: Ctrl+ v,然后按一下 Esc 鍵,在屏幕上顯示 ^[表示已輸入。\03339。 一、鎖 \開(kāi)鍵盤代碼 代碼定義: 鎖鍵盤: ESC[2h 開(kāi)鍵盤: ESC[2l 應(yīng)用: ( 1) 直接在鍵盤上順序敲入 Esc+ [+ 2+ h 四鍵,鍵盤即被鎖住。 因此,對(duì)于從每個(gè)客戶端發(fā)來(lái)的請(qǐng)求,服務(wù)器端都要?jiǎng)?chuàng)建相應(yīng)的線程去接收并處理;同理,對(duì)于客戶端而言,也要?jiǎng)?chuàng)建一個(gè)線程去讀取服務(wù)器端發(fā)來(lái)的信息。因此,本實(shí)驗(yàn)需要使用兩個(gè)線程去分別完成發(fā)送和接收信息的任務(wù),這兩個(gè)線程共享其進(jìn)程擁有的統(tǒng)一個(gè)端口地址。因此,不能通過(guò)創(chuàng)建進(jìn)程方式來(lái)解決上訴問(wèn)題,因?yàn)閮蓚€(gè)進(jìn)程會(huì)分別對(duì)應(yīng)兩個(gè)不同的端口,而發(fā)送和接收必須使用同一端口。這樣,當(dāng)接收信息任務(wù)因沒(méi)有信息而被阻塞時(shí),不至于影響發(fā)送任務(wù)的執(zhí)行。使用一個(gè)進(jìn)程去完成發(fā)送信息是沒(méi)有問(wèn)題的,因?yàn)榘l(fā)送總是主動(dòng)的;而使用同一個(gè)進(jìn)程再去完成接 10 受信息去不一定會(huì)成功 , 因?yàn)榻邮苄畔⑹潜粍?dòng)的 , 所以當(dāng)沒(méi)有信息可以接收時(shí) ,該進(jìn)程就 會(huì)被阻塞 , 從而導(dǎo)致發(fā)送任務(wù)也一起被阻塞。而每個(gè)進(jìn)程進(jìn)行通信的環(huán)節(jié)都包括了發(fā)送信息和接口信息兩個(gè)任務(wù),這兩個(gè)任務(wù)通過(guò)一個(gè)端口地址發(fā)送和接收。 當(dāng)所有的數(shù)據(jù)操作結(jié)束以后 , 可以調(diào)用 close( )函數(shù)來(lái)釋放該 Socket, 從而停止在該 Socket 上的任何數(shù)據(jù)操作。 recv( )返回實(shí)際上接收的字節(jié)數(shù) , 或當(dāng)出現(xiàn)錯(cuò)誤時(shí) , 返回 1 并置相應(yīng)的 errno 值。 recv( )函數(shù)原型為 : int recv ( int sockfd, void buf, int len, unsignedint flags); sockfd 是接收數(shù)據(jù)的 Socket 描述符 ; buf 是存放接收數(shù)據(jù)的緩沖區(qū) ; len 是緩沖的長(zhǎng)度。所以需要對(duì) send( )的返回值進(jìn)行測(cè)量。 flags一般情況下置為 0。 send( )函數(shù)原型為 : int send ( int sockfd, const void msg, int len, intflags); sockfd 是想用來(lái)傳輸數(shù)據(jù)的 Socket 描述符 , msg 是一個(gè)指向要發(fā)送數(shù)據(jù) (可以是字符型、整型、浮點(diǎn)型等 ) 的指針。 步驟 6: 數(shù)據(jù)傳輸 send( )和 recv( )。錯(cuò)誤發(fā)生時(shí)返回一個(gè) 1 并且設(shè)置相應(yīng)的 errno 值。而服務(wù)器可以繼續(xù)在以前的那個(gè) Socket 上監(jiān)聽(tīng) , 同時(shí)可以在新的 Socket 描述符上進(jìn)行數(shù)據(jù) send ( )(發(fā)送 ) 和recv( )(接收 ) 操作。 當(dāng)某個(gè)客戶端試圖與服務(wù)器監(jiān)聽(tīng)的端口連接時(shí) , 該連接請(qǐng)求將排隊(duì)等待服務(wù)器 accept( )它。當(dāng) listen 遇到錯(cuò)誤時(shí)返回 1, errno 被置為相 應(yīng)的錯(cuò)誤碼。 int listen( int sockfd, int backlog); sockfd 是 Socket 系統(tǒng)調(diào)用返回的 Socket 描述符 ; backlog 指定在請(qǐng)求隊(duì)列中允許的最大請(qǐng)求數(shù) , 進(jìn)入的連接請(qǐng)求將在隊(duì)列中等待 accept( )它們。進(jìn)行客戶端程序設(shè)計(jì)無(wú)須調(diào)用 bind( ), 因?yàn)檫@種情況下只需知道目的機(jī)器的 IP 地址 , 而客戶通過(guò)哪個(gè)端口與服務(wù)器建立連接并不需要關(guān)心 , 內(nèi)核會(huì)自動(dòng)選擇一個(gè)未被占用的端口供客戶端來(lái)使用。 connect( )函數(shù)原型為 : int connect ( int sockfd, struct sockaddrserv_addr, int addrlen) ; sockfd 是目的服務(wù)器的 Socket 描述符 ; serv_addr 是包含目的機(jī) IP 地址和端口號(hào)的指針 , addrlen 為結(jié)構(gòu)的大小。另外要注意的是 , 當(dāng)調(diào)用函數(shù)時(shí) , 一般不要將端口號(hào)置為小于 1024 的值 , 因?yàn)?1~ 1024 是保留端口號(hào) , 可以使用大于 1024 中任何一個(gè)沒(méi)有被占用的端口號(hào)。同樣 , 通過(guò)將 置為 INADDR_ANY, 系統(tǒng)會(huì)自動(dòng)填入本機(jī) IP 地 址。 int bind ( int sockfd, struct sockaddr _my_addr,int addrlen) ; 8 sockfd 是一個(gè) Socket 描述符 , my_addr 是一個(gè)指圖 計(jì)算機(jī)應(yīng)用 向包含有本機(jī) IP 地址及端口號(hào)等信息的 sockaddr 類型的指針 ; addrlen 常被設(shè)置為 sizeof ( structockaddr), 如果函數(shù)調(diào)用成功 , 就返回 0, 否則就返回為 1, 可以通過(guò)查看errno 的值來(lái)了解錯(cuò)誤的原因。為了像電話分配電 話號(hào)碼一樣 , 可以通過(guò) bind( )為建立的套接口綁定一個(gè)名字 ——分配地址 [8]。 Socket( )調(diào)用返回一個(gè)整型 Socket 描述符 , 可以在后面的調(diào)用使用它 , 當(dāng)其值為 1 時(shí) , 說(shuō)明有錯(cuò)誤發(fā)生。 Type 參數(shù)定義了套接口的類型 , 包括SOCK_STREAM 和 SOCK_DGRAM, SOCK_STREAM 指定為流套接口 ,SOCK_DGRAM 指定為數(shù)據(jù)報(bào)套接口。最后 , 待數(shù)據(jù)傳送結(jié)束后 , 雙方調(diào)用 close( )關(guān)閉 Socket??蛻粼诮?Socket 后 就可調(diào)用 connect()和服務(wù)器建立連接。 Socket 通信過(guò)程與程序開(kāi)發(fā) ( 1) Socket 通信過(guò)程 基于 TCP 可靠連接的客戶與服務(wù)器連接進(jìn)程流程圖如圖 。原始數(shù)據(jù)報(bào)套接字 (Raw Socket):該接口允許 對(duì)較低層協(xié)議,如 IP、 ICMP 直接訪問(wèn)。 數(shù)據(jù)報(bào)套接字 (Datagram Socket): TCP /IP 協(xié)議族中的 UDP 協(xié)議使用此類接口,它是無(wú)連接的服務(wù) ,數(shù)據(jù)通過(guò)相互獨(dú)立的報(bào)文進(jìn)行傳輸,提供了一個(gè)無(wú)連接服務(wù)。提供一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)地發(fā)送,且按發(fā)送順序接收。套接字在 TCP /IP 網(wǎng)絡(luò)模型中的地位如圖 所示。在 Linux 中 , 套接字接口是應(yīng)用程序訪問(wèn)下層的網(wǎng)絡(luò)協(xié)議的惟一方法 [6]。 TCP /IP 是計(jì)算機(jī)互連最常使用的網(wǎng)絡(luò)通訊協(xié)議 , TCP /IP 的核心部分由網(wǎng)絡(luò)操作系統(tǒng)的內(nèi)核實(shí)現(xiàn) , 應(yīng)用程序通過(guò)編程接口來(lái)訪問(wèn) TCP /IP。而套接口中的網(wǎng)絡(luò)地址就相當(dāng)于電話號(hào)碼。套接口與電話的相似性還表現(xiàn)在另一方面。 Linux 中的套接口與電話非常相似。 ( 2) Socket 原理 當(dāng)用電話與他人通信時(shí),必須拿起話筒,撥叫對(duì)方的電話號(hào)碼,然后等待對(duì)方的應(yīng)答; 當(dāng)雙方進(jìn)行通話的時(shí)候,就建立了一個(gè)具有兩個(gè)端點(diǎn)的通信線路,這兩個(gè)端點(diǎn)是 :本地的電話號(hào)碼 ( 在本地位置 );對(duì)方的電話號(hào)碼 ( 在對(duì)方的位置處 ) 。 Linux 操作系統(tǒng)具有良好的穩(wěn)定性和出色的網(wǎng)絡(luò)性能 , 因此被廣泛應(yīng)用于網(wǎng)絡(luò)服務(wù)領(lǐng)域。在應(yīng)用開(kāi)發(fā)中就像使用文件句柄一樣 , 可以對(duì) Socket 句柄進(jìn)行讀、寫(xiě)操作。 Socket 在計(jì)算機(jī)中提供了一個(gè)通信端口 , 可以通過(guò)這個(gè)端口與任何一個(gè)具有 Socket 接口的計(jì)算機(jī)通信。 網(wǎng)絡(luò)套接字 ( 1) Socket 基本概念 上世紀(jì)中后期,在美國(guó)國(guó)防部高研署 (DARPA)將 TCP /IP 的軟件提供給加利尼亞大學(xué) Berkeley 分校后 , TCP /IP 很快被集成到 Unix 中 , 同時(shí)出現(xiàn)了許多成熟的 TCP /IP 應(yīng)用程序接口 (API) 。所以多個(gè)客戶端之間的通信就變?yōu)榱丝蛻舳伺c服務(wù)端的通信。 圖 用三次握手建立 TCP 連接 對(duì)于兩個(gè)計(jì)算機(jī)之間連接的釋放過(guò)程也需要類似的 3 次握手的互相確認(rèn)的過(guò)程,如圖 所示。 由于 TCP 要提供可靠的、面向連接的運(yùn)輸服務(wù),所以不可避免地增加了許多系統(tǒng)開(kāi)銷,比如確認(rèn)、流量控制、計(jì)時(shí)器以
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1