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

正文內(nèi)容

基于linux網(wǎng)絡(luò)聊天室的設(shè)計(jì)3-文庫吧

2025-06-03 16:47 本頁面


【正文】 為Socket 接口( 套接口) 。Socket 在計(jì)算機(jī)中提供了一個(gè)通信端口, 可以通過這個(gè)端口與任何一個(gè)具有Socket 接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過這個(gè)Socket 接口來實(shí)現(xiàn)。在應(yīng)用開發(fā)中就像使用文件句柄一樣, 可以對(duì)Socket 句柄進(jìn)行讀、寫操作。今天, Socket 接口是TCP /IP 網(wǎng)絡(luò)最為通用的API, 也是在Internet 上進(jìn)行應(yīng)用開發(fā)最為通用的API。Linux 操作系統(tǒng)具有良好的穩(wěn)定性和出色的網(wǎng)絡(luò)性能, 因此被廣泛應(yīng)用于網(wǎng)絡(luò)服務(wù)領(lǐng)域。而在Linux下開發(fā)高性能的網(wǎng)絡(luò)通信程序, 是充分發(fā)揮Linux 網(wǎng)絡(luò)特性的一個(gè)關(guān)鍵因素。2 Socket 原理簡(jiǎn)介 當(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ì)方的位置處) 。雙方的通信與通信的兩個(gè)端點(diǎn)和他們之間的通信線路有關(guān)。Linux 中的套接口與電話非常相似。套接口代表通信線路中的端點(diǎn), 兩端點(diǎn)之間就是數(shù)據(jù)通信網(wǎng)絡(luò)。套接口與電話的相似性還表現(xiàn)在另一方面。當(dāng)給某人打電話時(shí), 撥叫的是對(duì)方用戶的電話號(hào)碼。而套接口中的網(wǎng)絡(luò)地址就相當(dāng)于電話號(hào)碼。通過在程序中指定遠(yuǎn)程套接口的地址, 就可以建立從本地套接口到 遠(yuǎn)端套接口的通信。TCP /IP 是計(jì)算機(jī)互連最常使用的網(wǎng)絡(luò)通訊協(xié)議, TCP /IP 的核心部分由網(wǎng)絡(luò)操作系統(tǒng)的內(nèi)核實(shí)現(xiàn),應(yīng)用程序通過編程接口來訪問TCP /IP。套接字( Socket) 是介于網(wǎng)絡(luò)應(yīng)用層和傳輸層之間的編程接口, 套接字接口提供了訪問下層通信協(xié)議的大量系統(tǒng)調(diào)用和相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。在Linux 中, 套接字接口是應(yīng)用程序訪問下層的網(wǎng)絡(luò)協(xié)議的惟一方法。具體講,套接字在用戶級(jí)實(shí)現(xiàn)了兩個(gè)應(yīng)用程序之間的網(wǎng)絡(luò)連接和數(shù)據(jù)交換, 所以Linux 中的套接字意味著網(wǎng)絡(luò)上的連接。套接字在TCP /IP 網(wǎng)絡(luò)模型中的地位如圖1所示。Socket 分為以下三種類型: 流式套接字( Stream Socket) : 是最常用的套接字類型, 文件傳送協(xié)議( FTP) 即使用流式套接字。提供一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù), 數(shù)據(jù)無差錯(cuò)、無重復(fù)地發(fā)送, 且按發(fā)送順序接收。內(nèi)設(shè)流量控制, 避免數(shù)據(jù)流超限。 數(shù)據(jù)被看作是字節(jié)流, 無長(zhǎng)度限制。數(shù)據(jù)報(bào)套接字(Datagram Socket) : TCP /IP 協(xié)議族中的UDP 協(xié)議使用此類接口, 它是無連接的服務(wù),數(shù)據(jù)通過相互獨(dú)立的報(bào)文進(jìn)行傳輸, 提供了一個(gè)無連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送, 不提供無錯(cuò)保證, 數(shù)據(jù)可能丟失或重復(fù), 并且接收順序混亂。原始數(shù)據(jù)報(bào)套接字(Raw Socket) : 該接口允許對(duì)較低層協(xié)議, 如IP、ICMP 直接訪問。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問。3 Socket 通信過程與程序開發(fā) Socket 通信過程 基于TCP 可靠連接的客戶與服務(wù)器連接進(jìn)程流程圖如圖2。Socket 工作過程如下: 服務(wù)器首先啟動(dòng), 通過調(diào)用Socket (), 建立一個(gè)Socket, 然后調(diào)用bind()將該Socket 和本地網(wǎng)絡(luò)地址綁系在一起, 再調(diào)用listen()使Socket 做好偵聽的準(zhǔn)備, 并規(guī)定它的請(qǐng)求隊(duì)列的長(zhǎng)度,之后就調(diào)用accept()來接收連接??蛻粼诮ocket 后就可調(diào)用connect()和服務(wù)器建立連接。連接一旦建立,客戶機(jī)和服務(wù)器之間就可以通過調(diào)用send()和recv()來發(fā)送和接收數(shù)據(jù)。最后, 待數(shù)據(jù)傳送結(jié)束后, 雙方調(diào)用close()關(guān)閉Socket。 Socket 通信程序開發(fā)下面詳細(xì)說明Socket 通信程序的開發(fā)過程:( 1) 步驟1: 建立套接口socket() int sockfd = socket ( int domain, int type, intprotocol) , 其中domain 參數(shù)指定socket 協(xié)議族, 包括PF_LOACL 和PF_INET, PF_LOACL 表示使用本地套接口, PF_INET 表示使用Internet 套接口。Type 參數(shù)定義了套接口的類型, 包括SOCK_STREAM 和SOCK_DGRAM, SOCK_STREAM 指定為流套接口,SOCK_DGRAM指定為數(shù)據(jù)報(bào)套接口。protocol 通常賦值“0”, 意味套接口使用TCP /IP 協(xié)議。socket()調(diào)用返回一個(gè)整型socket 描述符, 可以在后面的調(diào)用使用它, 當(dāng)其值為 1 時(shí), 說明有錯(cuò)誤發(fā)生。( 2) 步驟2: 綁定套接口bind() 當(dāng)用socket()建立套接口后, 該套接口還是處于無名狀態(tài)的, 無名套接口就象沒有號(hào)碼的電話一樣,別人無法向發(fā)送信息( 在同一linux 內(nèi)核下可實(shí)現(xiàn)無名狀態(tài)下通信) 。為了像電話分配電話號(hào)碼一樣, 可以通過bind()為建立的套接口綁定一個(gè)名字———分配地址。這一步對(duì)客戶端不是必需的。int bind ( int sockfd, struct sockaddr _my_addr,int addrlen) 。sockfd 是一個(gè)socket 描述符, my_addr 是一個(gè)指圖計(jì)算機(jī)應(yīng)用向包含有本機(jī)IP 地址及端口號(hào)等信息的sockaddr 類型的指針。 addrlen 常被設(shè)置為sizeof ( structockaddr) , 如果函數(shù)調(diào)用成功, 就返回0, 否則就返回為 1, 我們可以通過查看errno 的值來了解錯(cuò)誤的原因。需要指出的是, 可以用下面的賦值實(shí)現(xiàn)自動(dòng)獲得本機(jī)IP 地址和隨機(jī)獲取一個(gè)沒有被占用的端口號(hào):=0。 / 系統(tǒng)隨機(jī)選擇一個(gè)未被使用的端口號(hào) /=INADDR_ANY。 / 填入本機(jī)IP 地址 / 置為0, 函數(shù)會(huì)自動(dòng)為選擇一個(gè)未占用的端口來使用。同樣, 置為INADDR_ANY, 系統(tǒng)會(huì)自動(dòng)填入本機(jī)IP 地址。bind()函數(shù)在成功被調(diào)用時(shí)返回0。 遇到錯(cuò)誤時(shí)返回“ 1”并將errno 置為相應(yīng)的錯(cuò)誤號(hào)。另外要注意的是, 當(dāng)調(diào)用函數(shù)時(shí), 一般不要將端口號(hào)置為小于1024 的值, 因?yàn)?~1024 是保留端口號(hào), 可以使用大于1024 中任何一個(gè)沒有被占用的端口號(hào)。( 3) 步驟3: 請(qǐng)求連接connect()當(dāng)客戶端綁定地址后, 發(fā)送請(qǐng)求連接信號(hào)connect()來與遠(yuǎn)端服務(wù)器建立一個(gè)TCP 連接。connect()函數(shù)原型為:int connect ( int sockfd, struct sockaddrserv_addr, int addrlen) 。sockfd 是目的服務(wù)器的socket 描述符。 serv_addr是包含目的機(jī)IP 地址和端口號(hào)的指針, addrlen 為結(jié)構(gòu)的大小。遇到錯(cuò)誤時(shí)返回 1, 并且errno 中包含相應(yīng)的錯(cuò)誤碼。進(jìn)行客戶端程序設(shè)計(jì)無須調(diào)用bind(), 因?yàn)檫@種情況下只需知道目的機(jī)器的IP 地址, 而客戶通過哪個(gè)端口與服務(wù)器建立連接并不需要關(guān)心, 內(nèi)核會(huì)自動(dòng)選擇一個(gè)未被占用的端口供客戶端來使用。( 4) 步驟4: 監(jiān)聽連接
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1