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

正文內(nèi)容

基于tcp/ip上的socket編程接口技術(shù)及應(yīng)用(編輯修改稿)

2024-12-23 21:45 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 套接字也被稱(chēng)為 socket, socket 的英文原義是 “孔 ”或 “插座 ”。在這里作為4BDS UNIX 的進(jìn)程通信機(jī)制,取后一種意義。 socket 非常類(lèi)似于電話插座。以一個(gè)國(guó)家級(jí)電話網(wǎng)為例。電話的通話雙方相當(dāng)于相互通信的 2 個(gè)進(jìn)程,區(qū)號(hào)是它的網(wǎng)絡(luò)地址;區(qū)內(nèi)一個(gè)單位的交換機(jī)相當(dāng)于一臺(tái)主機(jī),主機(jī)分配給每個(gè)用戶的局內(nèi)號(hào)碼相當(dāng)于 socket 號(hào)。任何用戶在通話之 前,首先要占有一部電話機(jī),相當(dāng)于申請(qǐng)一個(gè) socket;同時(shí)要知道對(duì)方的號(hào)碼,相當(dāng)于對(duì)方有一個(gè)固定的 socket。然后向?qū)Ψ綋芴?hào)呼叫,相當(dāng)于發(fā)出連接請(qǐng)求 (假如對(duì)方不在同一區(qū)內(nèi),還要撥對(duì)方區(qū)號(hào),相當(dāng)于給出網(wǎng)絡(luò)地址 )。對(duì)方假如在場(chǎng)并空閑 (相當(dāng)于通信的另一主機(jī)開(kāi)機(jī)且可以接受連接請(qǐng)求 ),拿起電話話筒,雙方就可以正式通話,相當(dāng)于連接成功。雙方通話的過(guò)程,是一方向電話機(jī)發(fā)出信號(hào)和對(duì)方從電話機(jī)接收信號(hào)的過(guò)程,相當(dāng)于向 socket 發(fā)送數(shù)據(jù)和從 socket 接收數(shù)據(jù)。通話結(jié)束后,一方掛起電話機(jī)相當(dāng)于關(guān)閉 socket,撤消連接。 在電話系統(tǒng)中,一般用戶只能感受到本地電話機(jī)和對(duì)方電話號(hào)碼的存在,建立通話的過(guò)程,話音傳輸?shù)倪^(guò)程以及整個(gè)電話系統(tǒng)的技術(shù)細(xì)節(jié)對(duì)他都是透明的,這也與 socket 機(jī)制非常相似。 socket 利用網(wǎng)間網(wǎng)通信設(shè)施實(shí)現(xiàn)進(jìn)程通信,但它對(duì)通信設(shè)施的細(xì)節(jié)毫不關(guān)心,只要通信設(shè)施能提供足夠的通信能力,它就滿足了。 至此,我們對(duì) socket 進(jìn)行了直觀的描述。抽象出來(lái), socket 實(shí)質(zhì)上提供了進(jìn)程通信的端點(diǎn)。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒(méi)有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一 臺(tái)電話機(jī)一樣。在 網(wǎng)間 內(nèi)部,每一個(gè) socket 用一個(gè)半相關(guān)描述 :協(xié)議,本地地址,本地端口 。 一個(gè)完整的 socket 有一個(gè)本地唯一的 socket 號(hào),由操作系統(tǒng)分配。 最重要的是, socket 是面向客戶 /服務(wù)器模型而設(shè)計(jì)的,針對(duì)客戶和服務(wù)器程序提供不同的 socket 系統(tǒng)調(diào)用??蛻綦S機(jī)申請(qǐng)一個(gè) socket (相當(dāng)于一個(gè)想打電話的人可以在任何一臺(tái)入網(wǎng)電話上撥號(hào)呼叫 ),系統(tǒng)為之分配一個(gè) socket 號(hào);服務(wù)器擁有全局公認(rèn)的 socket ,任何客戶都可以向它發(fā)出連接請(qǐng)求和信息請(qǐng)求 (相當(dāng) 10 于一個(gè)被呼叫的電話擁有一個(gè) 呼叫方知道的電話號(hào)碼 )。 socket 利用客戶 /服務(wù)器模式巧妙地解決了進(jìn)程之間建立通信連接的問(wèn)題。服務(wù)器 socket 半相關(guān)為全局所公認(rèn)非常重要。 那么 兩個(gè)完全隨機(jī)的用戶進(jìn)程之間如何建立通信?假如通信雙方?jīng)]有任何一方的 socket 固定,就好比打電話的雙方彼此不知道對(duì)方的電話號(hào)碼,要通話是不可能的。 Socket 接口是訪問(wèn) Inter 使用得最廣泛的方法。 如果你有一臺(tái)剛配好TCP/IP 協(xié)議的主機(jī),其 IP 地址是 , 此時(shí)在另一臺(tái)主機(jī)或同一臺(tái)主機(jī)上執(zhí)行 ftp ,顯然無(wú)法建立連接。因 這臺(tái)主機(jī)沒(méi)有運(yùn)行 FTP 服務(wù)軟件。同樣, 在另一臺(tái)或同一臺(tái)主機(jī)上運(yùn)行瀏覽軟件 如 Netscape,輸入 主機(jī)上運(yùn)行一個(gè) FTP 服務(wù)軟件(該軟件將打開(kāi)一個(gè) Socket, 并將其綁定到 21端口),再在這臺(tái)主機(jī)上運(yùn)行一個(gè) Web 服務(wù)軟件(該軟件將打開(kāi)另一 個(gè) Socket,并將其綁定到 80 端口)。這樣,在另一臺(tái)主機(jī)或同一臺(tái)主機(jī)上執(zhí)行 ftp , FTP 客戶軟件將通過(guò) 21 端口來(lái)呼叫主機(jī)上由 FTP 服務(wù)軟件提供的 Socket,與其建立連接并對(duì)話。而在 scape 中輸入 時(shí),將通過(guò) 80 端口來(lái)呼叫主機(jī)上由 Web 服務(wù)軟件提供的 Socket,與其建 立連接并對(duì)話。 在 Inter 上有 很多這樣的主機(jī),這些主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開(kāi)一個(gè) Socket,并綁定到一個(gè)端口上,不同的端口對(duì)應(yīng)于不同的服務(wù)。 Socket 正如其英文原意那樣,象一個(gè)多孔插座。一臺(tái)主機(jī)猶如布滿各種插座的房間,每個(gè)插座有一個(gè)編號(hào),有的插座提供 220 伏交流電, 有的提供 110 伏交流電,有的則提供有線電視節(jié)目。 客戶軟件將插頭插到不同編號(hào)的插座,就可以得到不同的服務(wù)。 套接字 的概念 在網(wǎng)絡(luò)編程中最常見(jiàn)的是客戶 /服務(wù)器模式。以該模式編程時(shí) 客戶端在需要的時(shí)候,向服務(wù)端發(fā)出連接請(qǐng)求 , 服務(wù)端有一個(gè)進(jìn)程(或多個(gè)進(jìn)程)在指定的端口等待客戶來(lái)連接,服務(wù)程序等待客戶的連接信息,一旦連接上之后,就可以按設(shè)計(jì)的數(shù)據(jù)交換方法和格式進(jìn)行數(shù)據(jù)傳輸。使用 socket 調(diào)用后,僅產(chǎn)生了一個(gè)可以使用的 socket 描述符,這時(shí)還不能進(jìn)行通信,還要使用其他的調(diào)用,以使得 11 socket 所指的結(jié)構(gòu)中使用的信息被填寫(xiě)完。在使用 TCP 協(xié)議時(shí),一般服務(wù)端進(jìn)程先使用 socket 調(diào)用得到一個(gè)描述符,然后使用 bind 調(diào)用將一個(gè)名字與 socket描述符連接起來(lái),對(duì)于 Inter 域就是將 Inter 地址聯(lián)編到 socket。之后,服 務(wù)端使用 listen 調(diào)用指出等待服務(wù)請(qǐng)求隊(duì)列的長(zhǎng)度。然后就可以使用 accept 調(diào)用等待客戶端發(fā)起連接(一般是阻塞等待連接,),一旦有客戶端發(fā)出連接, accept 返回客戶的地址信息,并返回一個(gè)新的 socket 描述符,該描述符與原先的 socket有相同的特性,這時(shí)服務(wù)端就可以使用這個(gè)新的 socket 進(jìn)行讀寫(xiě)操作了。一般服務(wù)端可能在 accept 返回后創(chuàng)建一個(gè)新的進(jìn)程進(jìn)行與客戶的通信,父進(jìn)程則再到accept 調(diào)用處等待另一個(gè)連接??蛻舳诉M(jìn)程一般先使用 socket 調(diào)用得到一個(gè)socket 描述符,然后使用 connect 向指定的服務(wù)器上的指定端口發(fā)起連接,一旦連接成功返回,就說(shuō)明已經(jīng)建立了與服務(wù)器的連接,這時(shí)就可以通過(guò) socket 描述符進(jìn)行讀寫(xiě)操作了。 使用無(wú)連接的 UDP 協(xié)議時(shí),服務(wù)端進(jìn)程創(chuàng)建一個(gè) socket,之后調(diào)用 recvfrom接收客戶端的數(shù)據(jù)報(bào),然后調(diào)用 sendto 將要返回客戶端的消息發(fā)送給客戶進(jìn)程??蛻舳艘惨葎?chuàng)建一個(gè) socket,再使用 sendto 向服務(wù)端進(jìn)程發(fā)出請(qǐng)求,使用recvfrom 得到返回的消息 。 如何開(kāi)發(fā)一個(gè) ServerClient 模型的程序 服務(wù)器,使用 ServerSocket 監(jiān)聽(tīng)指定的端口,端口可以隨意指定(由于 1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于 1024 的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。 客戶端,使用 Socket 對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開(kāi)會(huì)話;會(huì)話完成后,關(guān)閉 Socket。客戶端不需要指定打開(kāi)的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè) 1024 以上的端口 [10]。 Socket 接口是 TCP/IP 網(wǎng)絡(luò)的 API, Socket 接口定義了許多函數(shù)或例程 ,程序員可以用它們來(lái)開(kāi)發(fā) TCP/IP 網(wǎng)絡(luò)上的應(yīng)用程序。 Socket 接口設(shè)計(jì)者最先是將接口放在 Unix 操作系統(tǒng)里面的。如果了解 Unix 系統(tǒng)的輸入和輸出的話,就很容易了解 Socket 了。網(wǎng)絡(luò)的 Socket 數(shù)據(jù)傳輸是一種特殊的 I/O, Socket 也是一種文件描述符。 Socket 也具有一個(gè)類(lèi)似于打開(kāi)文件的函數(shù)調(diào)用 Socket(),該函數(shù)返回 12 一個(gè)整型的 Socket 描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^(guò)該 Socket實(shí)現(xiàn)的 。 TCP/IP 的 socket 提供的套接字的類(lèi)型。 常用的 Socket 類(lèi)型 有 三 種:流式 Socket( SOCK_STREAM) 、 原始式套接字( SOCK_RAW) 和數(shù)據(jù)報(bào)式 Socket( SOCK_DGRAM)。流式是一種面向連接的 Socket,針對(duì)于面向連接的 TCP 服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式 Socket 是一種無(wú)連接的 Socket,對(duì)應(yīng)于無(wú)連接的 UDP 服務(wù)應(yīng)用 ; 原始式套接字( SOCK_RAW)該接口允許對(duì)較低層協(xié)議,如 IP、 ICMP 直接訪問(wèn)。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問(wèn)現(xiàn)有服務(wù)中配置的新設(shè)備。 在網(wǎng)絡(luò)編程中較多采用的是 面向連接的套接字 ,使用面向連接的協(xié)議 (TCP)。調(diào)用時(shí)序圖如圖 所示。 13 圖 面向連接協(xié)議的 套接字時(shí)序調(diào)用圖 另外一種常見(jiàn)的套接字類(lèi)型 無(wú)連接協(xié)議的套接字 ,其使用無(wú)連接的 UDP 服務(wù)應(yīng)用。如圖 給出了 數(shù)據(jù)報(bào)式套接字時(shí)序調(diào)用圖 圖 無(wú)連接協(xié)議的 套接字時(shí)序調(diào)用圖 基本套接字系統(tǒng)調(diào)用 為了建立 Socket,程序可以調(diào)用 Socket 函數(shù),該函數(shù)返回一個(gè)類(lèi)似于文件描述符的句柄。 socket 函數(shù)原型為: int socket(int domain, int type, int protocol);domain 指明所使用的協(xié)議族,通常為 PF_INET,表示互聯(lián)網(wǎng)協(xié)議族( TCP/IP 協(xié)議族); type 參數(shù)指定 socket 的類(lèi)型: SOCK_STREAM 、 SOCK_RAW 或SOCK_DGRAM, Socket 接口還定義了原始 Socket( SOCK_RAW),允許程序使用低層協(xié)議; protocol 通常賦值 0。 Socket()調(diào)用返回一個(gè)整型 socket 描述符,你可以在后面的調(diào)用使用它。 Socket 描述符是一個(gè)指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描述符表入口。調(diào)用 Socket 函數(shù)時(shí), socket 執(zhí)行體將建立一個(gè) Socket,實(shí)際上 建立一個(gè) Socket意味著為一個(gè) Socket 數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間。 Socket 執(zhí)行體為你管理描述符表。兩個(gè)網(wǎng)絡(luò)程序之間的一個(gè)網(wǎng)絡(luò)連接包括五種信息:通 信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。 Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。 創(chuàng)建套接字── socket() 應(yīng)用程序在使用套接字前,首先必須擁有一個(gè)套接字,系統(tǒng)調(diào)用 socket()向應(yīng)用程序提供創(chuàng)建套接字的手段,其調(diào)用格式如下: 14 SOCKET PASCAL FAR socket(int af, int type, int protocol)。 該調(diào)用要接收三個(gè)參數(shù): af、 type、 protocol。參數(shù) af 指定通信發(fā)生的區(qū)域,UNIX 系統(tǒng)支持的地址族有: AF_UNIX、 AF_INET、 AF_NS 等,而 DOS、WINDOWS 中僅支持 AF_INET,它是網(wǎng)際網(wǎng)區(qū)域。因此,地址族與協(xié)議族相同。參數(shù) type 描述要建立的套接字的類(lèi)型。參數(shù) protocol 說(shuō)明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為 0,使用默認(rèn)的連接模式。根據(jù)這三個(gè)參數(shù)建立一個(gè)套接字,并將相應(yīng)的資源分配給它,同時(shí)返回一個(gè)整型套接字號(hào)。因此, socket()系統(tǒng)調(diào)用實(shí)際上指定了全相關(guān)五元組中的“協(xié)議 ”這一元。 指定本地地址── bind() 當(dāng)一個(gè)套接字用 socket()創(chuàng)建后,存在一個(gè)名字空間 (地址族 ),但它沒(méi)有被命名。 bind()將套接字地址(包括本地主機(jī)地址和本地端口地址)與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái),即將名字賦予套接字,以指定本地半相關(guān)。其調(diào)用格式如下: int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen)。 參數(shù) s 是由 socket()調(diào)用返回的并且未作連接的 套接字描述符 (套接字號(hào) )。參數(shù) name 是賦給套接字 s 的本地地址(名字),其長(zhǎng)度可變,結(jié)構(gòu)隨通信域的不同而不同。 namelen 表明了 name 的長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生, bind()返回 0。否則返回值 SOCKET_ERROR。 bind() 在錯(cuò)誤的時(shí)候依然是返回 1,并且設(shè)置全局錯(cuò)誤變量 errno。在你調(diào)用 bind() 的時(shí)候,你要小心的另一件事情是:不要采用小于 1024 的端口號(hào)。所有小于 1024 的端口號(hào)都被系統(tǒng)保留!你可以選擇從 1024 到 65535 的端口 (如果它們沒(méi)有被別的程序使用的話 )。 你要注意的另外一件小事是;有時(shí)候你根本不需要調(diào)用它。如果你使用connect()來(lái)和遠(yuǎn)程機(jī)器進(jìn)行通訊,你不需要關(guān)心你的本地端口號(hào) (就象你在使用 tel 的時(shí)候 ),你只要簡(jiǎn)單的調(diào)用 connect() 就可以了,它會(huì)檢查套接字是否綁定端口,如果沒(méi)有,它會(huì)自己綁定一個(gè)沒(méi)有使用的本地端口。 建立套接字連接── connect()與 accept() 這兩個(gè)系統(tǒng)調(diào)用用于完成一個(gè)完整相關(guān)的建立,其中 connect()用于建立連 15 接。無(wú)連接的套接字進(jìn)程也可以調(diào)用 connect(),但這時(shí) 在進(jìn)程之間沒(méi)有實(shí)際的報(bào)文交換,調(diào)用將從本地操作系統(tǒng)直接返回。這樣做的優(yōu)點(diǎn)是程序員不必為每一數(shù)據(jù)指定目的地址,而且如果收到的一個(gè)數(shù)據(jù)報(bào),其目的端口未與任何套接字建立“連接” ,accept()用于使服務(wù)器等待來(lái)自某客戶進(jìn)程的實(shí)際連接。 connect()的調(diào)用格式如下: int PASCAL FAR c
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1