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

正文內(nèi)容

tcp協(xié)議和udp協(xié)議-資料下載頁

2024-10-26 11:04本頁面

【導(dǎo)讀】本章從網(wǎng)絡(luò)程序設(shè)計(jì)角度提供足夠的細(xì)節(jié)以理解如何使用TCP協(xié)議和UDP協(xié)議。提供這些協(xié)議的實(shí)際設(shè)計(jì)、具體實(shí)現(xiàn)和相關(guān)的注意事項(xiàng)。的相關(guān)協(xié)議分別是TCP協(xié)議和UDP協(xié)議。目前絕大多數(shù)的客戶服務(wù)器應(yīng)用程序都使用TCP. 輸層直接使用IPv4或IPv6,但這種方法使用較少?;騃Pv6數(shù)據(jù)報,然后發(fā)送到目的地址。但是,UDP并不能保證UDP數(shù)據(jù)報最終能夠到達(dá)。使用UDP進(jìn)行程序設(shè)計(jì)所遇到的問題是缺乏可靠性。每個UDP數(shù)據(jù)報都有一定的長度,可以把一個數(shù)據(jù)報看作一個記錄。向應(yīng)用程序提供的TCP服務(wù)與UDP服務(wù)不同。排序;第四,TCP提供流量控制??康淖止?jié)流協(xié)議。據(jù)報,該數(shù)據(jù)報導(dǎo)致一個IP數(shù)據(jù)報的發(fā)送。程序應(yīng)注意所產(chǎn)生IP數(shù)據(jù)報的大小。端口號標(biāo)識出發(fā)送進(jìn)程和接收進(jìn)程。含IP報頭的某些域,目的是讓UDP檢測數(shù)據(jù)確已到達(dá)正確的目的端。者與接收者之間任何地方的UDP報頭或數(shù)據(jù)所發(fā)生的任何改動。也應(yīng)看到某些路據(jù)鏈路協(xié)議沒有任何形式的數(shù)據(jù)鏈路校驗(yàn)和。

  

【正文】 ype 參數(shù)指定了將建立的套接字是用于面向連接模型還是無連接模型的。參數(shù)值SOCK_STREAM 為面向連接模型, SOCK_DGRAM 為面向無連接類型。 最后一個參數(shù)是 protocol,指定套接字所使用的協(xié)議。該值一般被設(shè)置為 0,這種情況下 SOCK_STREAM 套接字將使用 TCP 協(xié)議,而 SOCK_DGRAM 將使用 UDP 協(xié)議。 Socket 系統(tǒng)調(diào)用一般將返回一個非負(fù)整數(shù)作為套接字的描述符,可以像常見的 UNIX 系統(tǒng)中的文件描述符一樣來處理。 面向連接編程模型 面向連接編程模型使用的主要系統(tǒng)調(diào)用 在面向連接編程模型中,下列系統(tǒng)調(diào)用是必要的。 1 綁定: bind 系統(tǒng)調(diào)用把一臺機(jī)器的真正的網(wǎng)絡(luò)地址與一個套接字標(biāo)識符關(guān)聯(lián)在一起。具體用法如下: include sys/ include sys/ int bind(int sockfd, const struct sockaddr *address, size_t add_len)。 第一個參數(shù) sockfd 是從 socket 系統(tǒng)調(diào)用返回的文件描述符。第二個參數(shù)在這里使用一個包含服務(wù)器地址信息的 struct sockaddr_in 類型地址。最后一個參數(shù)存儲套接字實(shí)際使用的地址指針的大小。如果 bind 調(diào)用成功將返回 0,否則將返回 1。例如,該地址上已經(jīng)存在一個套接字時調(diào)用就會失敗,且 errno 將被置為 EADDRINUSE。 2 監(jiān)聽: 綁定之后,在任何客戶端系統(tǒng)可以連接到新建立的服務(wù)器端點(diǎn)之前,服務(wù)器必須設(shè)定為等待連接。這項(xiàng)工作由 listen 系統(tǒng)調(diào)用完成。具體用法如下: include sys/ int listen(int sockfd, int queue_size)。 sockfd 參數(shù)含義和 bind 調(diào)用中的相同。服務(wù)器最多可以將 queue_size 個進(jìn)入的連接請求排入隊(duì)列。( XTI 指定了 5 個這樣的請求作為可移植的最大值)。 3 接受: 當(dāng)服務(wù)器收到一個客戶端的 connect 請求時,它必須建立一個新的套接字來處理這個特定的通信。第一個套接字只是用來建立通信。第二個套接字是由 accept 來完成的。具體用法如下: include sys/ include sys/ int accept(int sockfd, struct sockaddr *address, size_t *add_len)。 accept 系統(tǒng)調(diào)用處理從原始的 socket 系統(tǒng)調(diào)用返回的正在監(jiān)聽的套接字描述符。如果成功則返回值是用來通信的新的套接字描述符。 address 參數(shù)將被客戶端的信息填充。然而,因?yàn)檫@是一個面向連接模型的通信,服務(wù)器幾乎不需要知道客戶端的地址,因此 address 參數(shù)可以用 NULL 來代替。如果 address 參數(shù)不是 NULL,那么 add_len 參數(shù)指向的變量,最初還應(yīng)該包含 address 參數(shù)所描述的地址結(jié)構(gòu)體的長度。 accept 調(diào)用返回時, *add_len 將保存實(shí)際被復(fù)制的字節(jié)數(shù)。 4 連接: 為了向服務(wù)器請求連接,客戶端使用 connect 系統(tǒng)調(diào)用。具體用法如下: include sys/ include sys/ int connect(int sockfd, const struct sockaddr *address, size_t add_len)。 第一個參數(shù) sockfd 是相關(guān)的客戶端套接字的文件描述符(由本地操作系統(tǒng)分配),它與服務(wù)器上的套接字標(biāo)識符沒有關(guān)系。 address 參數(shù)是指向一個包含服務(wù)器地址的結(jié)構(gòu)體的指針,同樣, add_len 參數(shù)是所指向的地址結(jié)構(gòu)體中實(shí)際使用的字節(jié)長度。 5 數(shù)據(jù)的發(fā)送和接收: 如果上述工作成功完成,那么在客戶機(jī)和服務(wù)器之間就建立了一個通信通路。由于套接字的類型被設(shè)置為 SOCK_STREAM,所以客戶端和服務(wù)器都有一個(不同的)文件描述符來用于讀寫數(shù)據(jù)。在大多數(shù)情況下, read 和 write 系統(tǒng)調(diào)用可 以正常地使用。然而,如果有關(guān)通過網(wǎng)絡(luò)發(fā)送數(shù)據(jù)方法的額外參數(shù)需要設(shè)置,則系統(tǒng)提供了兩個新的系統(tǒng)調(diào)用。 send 和 recv 可以簡單地用作 read 和 write。事實(shí)上,如果它們的第四個參數(shù)設(shè)置為 0,它們與 read 和 write 并無區(qū)別。具體用法如下: include sys/ include sys/ ssize_t send(int sockfd, const void *buffer, size_t length, int flags)。 ssize_t recv(int sockfd, void *buffer, size_t length, int flags)。 recv 調(diào)用從指定的文件描述符讀取數(shù)據(jù),存放到 buffer 中, buffer 的長度是 length。與read 調(diào)用類似, recv 返回讀取數(shù)據(jù)的長度。 Flags 參數(shù)影響數(shù)據(jù)被接收的方式??赡艿闹得枋鋈缦拢? MSG_PEEK 進(jìn)程查看數(shù)據(jù)但是并不真正“接收”。 MSG_OOB 普通數(shù)據(jù)被忽略,進(jìn)程只接收“帶外數(shù)據(jù)”,例如中斷信號。 MSG_WAITALL recv 調(diào)用只有接收到足夠長度的數(shù)據(jù)時才返回。 如果 flags 參數(shù)設(shè)置為 0,則 send 的行為和 write 一樣,把 buffer 中保存的信息發(fā)送到sockfd,一個本地套接字。 Length 參數(shù)指明了 buffer 的長度。與 recv 類似, flags 參數(shù)影響消息發(fā)送的方式??赡苤等缦拢? MSG_OOB 發(fā)送“帶外數(shù)據(jù)”。 MSG_DONTROUTE 發(fā)送消息時忽略任何基礎(chǔ)協(xié)議的路由條件。一般來講,這意味著信息將通過最直接的路徑而不是最快速的路徑發(fā)送(最快速的路徑也許會更復(fù)雜,這和網(wǎng)絡(luò)當(dāng)時的負(fù)載情況有關(guān))。 6 關(guān)閉連接: 套接字是一種雙向通信機(jī)制,因此通信一方不可能預(yù)先知道當(dāng)通信發(fā)生中斷時,對方進(jìn)程是在進(jìn)行讀操作還是寫操作。當(dāng)進(jìn)程試圖向一個已經(jīng)斷開連接的套接字 write或 send 數(shù)據(jù)時,它會收到一個 SIGPIPE 信號,一般情況下,這個信號是需要處理的。也就是說,需要構(gòu)造一個恰當(dāng)?shù)男盘柼幚砗瘮?shù)。 如果 read 或 recv 調(diào)用返回 0,說明連接結(jié)束。因此始終需要檢查 read 或 recv 的返回值,并做相應(yīng)的處理。 close 系統(tǒng)調(diào)用可以用于關(guān)閉一個套接字。如果連接的類型是 SOCK_STREAM,那么內(nèi)核將保證數(shù)據(jù)被 發(fā)往接收進(jìn)程。這也許會使關(guān)閉操作阻塞,直到所有的數(shù)據(jù)傳送完成。(如果連接類型為 SOCK_DGRAM,那么套接字將被馬上關(guān)閉)。 面向連接服務(wù)流程 Berkeley UNIX 支持 TCP/IP 協(xié)議,它們通過一組原語 (socket)來訪問網(wǎng)絡(luò),獲得極為廣泛的應(yīng)用,成為事實(shí)上的標(biāo)準(zhǔn)。 Sun 工作站的操作系統(tǒng) SunOS 也使用這種方法訪問網(wǎng)絡(luò)。 Berkeley 的原語由一組允許用戶訪問傳送服務(wù)的系統(tǒng)功能調(diào)用來實(shí)現(xiàn)。 主要的系統(tǒng)調(diào)用列舉下: 1. s= socket( domain, type, protocol); 建立給定類型的 TSAP。 2. bind( s, localaddr, addrlen); 為前面創(chuàng)建的 socket 分配一個本地地址。 3. connect( s, server, serverlen); 發(fā)起與遠(yuǎn)端 socket 的一個連接。 4. listen( s, n): 建立一個隊(duì)列以存儲外來的連接請求。 5. accept( S, from, fromlen); 將一個連接請求從隊(duì)列中移出或等待 一個連接請求。 6. send( s, buf, buflen, flags); 在給定的 socket 上發(fā)送一個報文(有連接)。 7. recv(s, buf, buflen, flags); 在給定的 socket 上接收一個報文 (有連接 )。 8. close(s); 拆除一個 socket 上的連接。 9. shutdown(s, how); 終止一個 socket 上的連接。 10. sendto(s, buf, buflen, flags, to, tolen)。 在無連接的 socket 上發(fā)送一個報文。 11. recvfrom(s, buf,buflen, flags, from, fromlen)。 在無連接的 socket 上接收一個報文。 12. select(nfds, readfds, writefds, exceptfds, timeout); 檢查一組 socket,看它們是否可讀或可寫。 服務(wù)接口的核心是 socket(管座 )概念,它與 OSI 的 TSAP 相似,它是各連接可以從下面 (操作一邊 )與之相連的端點(diǎn),也是各進(jìn)程可以從上面 (用戶一邊 )與之相連的端點(diǎn)。系統(tǒng)調(diào)用 socket 創(chuàng)建 — 個管座 (操作系統(tǒng)中的一個數(shù)據(jù)結(jié)構(gòu) ),分配一個小的整數(shù)號作為其說明符 s。調(diào)用中的各參數(shù)分別說明地址的格式 domain(如 ARPA 網(wǎng)際網(wǎng)的名字或 UNIX 中的路徑名 ),管座類型 type(如面向連接的 stream 管座或無連接的數(shù)據(jù)報管座 ),以及使用的協(xié)議protocol(如 TCP/IP 或 UDP/IP)。 為了讓遠(yuǎn)端用戶能向管座發(fā)送連接請求,管座就必須有一個地址。通過 bind 系統(tǒng)調(diào)用可以將地址和管座聯(lián)系起來。 一旦聯(lián)系好,就可以將管座的地址以某種方式發(fā)布出去,于是遠(yuǎn)端進(jìn)程就可以訪問該管座。 為了發(fā)起與遠(yuǎn)端 (如服務(wù)員 )的連接,進(jìn)程可以使用 connect 系統(tǒng)調(diào)用,并以本地管座和遠(yuǎn)端管座地址作為參數(shù)。這一調(diào)用在兩個管座之間建立一條連接?;蛘撸绻茏鶠闊o連接類型,操作系統(tǒng)記下兩個管座間的聯(lián)系,以便在本地管座上執(zhí)行 send 能將報文送到遠(yuǎn)端管座,盡管兩管座間沒有正式連接存在。 服務(wù)員為了接收一個顧客的連接,必須執(zhí)行兩個步驟 (但使用 UDP 的管座除外 ); listen(s, glength); snew=accept(s, from, fromlen); 其中 listen 是等待 — 個連接請求的到來,第二個參數(shù)指定可在隊(duì)列中等待服務(wù)員接受的最大連接數(shù),如 5。如果該隊(duì)列已滿,則對后來請求連接的報文置之不理。第二步是服務(wù)員使用該管座接受一個連接,返回一個新的管座 (其說明符為 snew)。如果服務(wù)員希望找出其顧客是誰,可供給一個緩存器 from 放置顧客管座的名字。參量 fromlen 是服務(wù)員最初用來指出 from 使用多大空間,當(dāng)返回真實(shí)長度時再作修改。若對顧客名字不感興趣,第二個參量也可置為零。 accept()調(diào)用通常是阻塞式原語,在一個連接可用前,不會返回。 如果一個請求已經(jīng)到達(dá),就將其從管座的隊(duì)列中取出;否則進(jìn)程封鎖管座直到一個請求到來為止 (除非已將管座說明為非封鎖性的 )。不管哪種方式,當(dāng)可獲得請求時,就建立一新的管座并將此管座用作連接端點(diǎn)。通過這一方式,單個眾所周知的端口就可以用于建立很多連接。 一旦管座不再用,可以使用 close()調(diào)用釋放。此時,如果有連接的管座還有數(shù)據(jù),則系統(tǒng)將力征繼續(xù)把該數(shù)據(jù)傳送出去。但是如果相當(dāng)長時間 (如 4 分鐘 )后該數(shù)據(jù)仍未送出去,則將作廢。如果不用 此管座收發(fā)任何數(shù)據(jù),可在用 close()調(diào)用前使用 shutdown()調(diào)用,其中的參數(shù) how 可取 0, 1, 2。當(dāng)用戶不再想讀數(shù)據(jù)時為 0,不再發(fā)送數(shù)據(jù)時為 l,不再發(fā)送或接收數(shù)據(jù)時為 2。對管座使用 shutdown()操作可使在排隊(duì)中的數(shù)據(jù)立即作廢。 管座用于數(shù)據(jù)報服務(wù),發(fā)送與接收數(shù)據(jù)時使用 sendto()和 reevfrom()原語, to 和 tolen 指報文的接收者,而 from 和 fromlen 指從何處接收。 select 調(diào)用對建立了幾條連接的進(jìn)程很有用處。在很多情況下,這樣的進(jìn)程可以在有報文時它處理的任何管 座上執(zhí)行 recv 調(diào)用,但它不知道哪個管座上已有報文,哪個上沒有。如果它選取一個管座,而報文在其他一些管座上時,它可能因等待報文而封鎖很長時間。此時它可以用 select 調(diào)用,此調(diào)用終止時,調(diào)用者被告知哪些管座上有報文,哪些沒有。 nfds指定文件說明符范圍, timeout 指定 select 等待的時間,其余 3 個參數(shù)作為位掩碼,分別用讀、寫、異常處理文件設(shè)置。 基于顧客服務(wù)員模型的面向連接服務(wù)流程如圖 210 所示。 圖 210 面向連接服務(wù)流程 面向連接服務(wù)程序例子 這個例子是根據(jù)圖 210 給出的面向連接的顧
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1