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

正文內(nèi)容

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

2024-12-23 21:45 本頁面
 

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