1. 程式人生 > >TCP如何區分監聽套接字和已連線套接字???

TCP如何區分監聽套接字和已連線套接字???

2.10 TCP埠號與併發伺服器

併發伺服器中主伺服器迴圈通過派生一個子程序來處理每個新的連線。如果一個子程序繼續使用伺服器眾所周知的埠來服務一個長時間的請求,那將發生什麼?讓我們來看一個典型的序列。首先,在主機freebsd上啟動伺服器,該主機是多宿的,其IP地址為12.106.32.254和192.168.42.1。伺服器在它的眾所周知的埠(本例為21)上執行被動開啟,從而開始等待客戶的請求,如圖2-11所示。

 
圖2-11 TCP伺服器在埠21上執行被動開啟

我們使用記號{*:21, *:*}指出伺服器的套接字對。伺服器在任意本地介面(第一個星號)的埠21上等待連線請求。外地IP地址和外地埠都沒有指定,我們用"*.*"來表示。我們稱它為監聽套接字(listening socket)。

我們用分號來分割IP地址和埠號,因為這是HTTP的用法,其他地方也常見。netstat程式使用點號來分割IP地址和埠號,不過如此表示有時候會讓人混淆,因為點號既用於域名(如freebsd.unpbook.com.21),也用於IPv4的點分十進位制數記法(如12.106.32. 254.21)。

這裡指定本地IP地址的星號稱為通配(wildcard)符。如果執行伺服器的主機是多宿的(如本例),伺服器可以指定它只接受到達某個特定本地介面的外來連線。這裡要麼選一個介面要麼選任意介面。伺服器不能指定一個包含多個地址的清單。通配的本地地址表示"任意"這個選擇。在圖1-9中,通配地址通過在呼叫bind之前把套接字地址結構中的IP地址欄位設定成INADDR_ANY來指定。

稍後在IP地址為206.168.112.219的主機上啟動第一個客戶,它對伺服器的IP地址之一12.106.32.254執行主動開啟。我們假設本例中客戶主機的TCP為此選擇的臨時埠為1500,如圖2-12所示。圖中在該客戶的下方標出了它的套接字對。

 
(點選檢視大圖)圖2-12 客戶對伺服器的連線請求

當伺服器接收並接受這個客戶的連線時,它fork一個自身的副本,讓子程序來處理該客戶的請求,如圖2-13所示。(我們將在4.7節中講解fork函式。)

至此,我們必須在伺服器主機上區分監聽套接字和已連線套接字(connected socket)。注意已連線套接字使用與監聽套接字相同的本地埠(21)。還要注意在多宿伺服器主機上,連線一旦建立,已連線套接字的本地地址(12.106.32.254)隨即填入。

 
(點選檢視大圖)圖2-13 併發伺服器讓子程序處理客戶

下一步我們假設在客戶主機上另有一個客戶請求連線到同一個伺服器。客戶主機的TCP為這個新客戶的套接字分配一個未使用的臨時埠,譬如說1501,如圖2-14所示。伺服器上這兩個連線是有區別的:第一個連線的套接字對和第二個連線的套接字對不一樣,因為客戶的TCP給第二個連線選擇了一個未使用的埠(1501)。

 
(點選檢視大圖)圖2-14 第二個客戶與同一個伺服器的連線

通過本例應注意,TCP無法僅僅通過檢視目的埠號來分離外來的分節到不同的端點。它必須檢視套接字對的所有4個元素才能確定由哪個端點接收某個到達的分節。圖2-14中對於同一個本地埠(21)存在3個套接字。如果一個分節來自206.168.112.219埠1500,目的地為12.106.32.254埠21,它就被遞送給第一個子程序。如果一個分節來自206.168.112.219埠1501,目的地為12.106.32.254埠21,它就被遞送給第二個子程序。所有目的埠為21的其他TCP分節都被遞送給擁有監聽套接字的最初那個伺服器(父程序)。

相關推薦

TCP如何區分連線???

2.10 TCP埠號與併發伺服器 併發伺服器中主伺服器迴圈通過派生一個子程序來處理每個新的連線。如果一個子程序繼續使用伺服器眾所周知的埠來服務一個長時間的請求,那將發生什麼?讓我們來看一個典型的序列。首先,在主機freebsd上啟動伺服器,該主機是多宿的,其IP地址為12.106.32.254和192.1

accept中的連線

int accept(int sockfd, struct sockaddr* cliaddr, socklen_t *addrlen); 該函式用於從已完成連線的佇列隊頭返回下一個已完成連線。 其中sockfd為監聽套接字 cliaddr和addrlen由核心填入

Erlang TCP Socket程序接收程序

Erlang TCP Socket監聽程序和接收程序的說明 轉自:https://blog.csdn.net/summerhust/article/details/8740973 一旦打開了一個使用TCP連線的套接字,它就始終保持開啟狀態,直至任何一方關閉它或因為一個錯誤而終止。在建立一

手機back鍵頂部的回退

sil tle pop eve list message false ati dev // 回退事件,監聽 手機back鍵和頂部的回退 pushHistory(); window.addEventListener("popstate",

ScrollView滑動到頂部底部的方法

col sets @override bottom void bsp div nds over 不需要監聽滑動位置,只需要重寫ScrollView的onOverScrolled和stopNestedScroll方法就可以了 public class ReadScrollV

Android 屏幕喚醒關閉的廣播

n) 應用 dma 今天 new and androidm receive err 今天希望應用程序的服務運行時,可以監聽到屏幕的喚醒。繼續百度學習法,連同監聽閉幕關閉也一同學習了。 此種情況需要動態註冊系統廣播。在AndroidManifest.xml中靜態註冊

Android中ScrollView滑動停止滑動到底部

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

js 事件的疊加移除

  html DOM元素有很多on開頭的監聽事件,如onload、onclick等,見DOM事件列表。但是同一種事件,後面註冊的會覆蓋前面的: window.onresize = function(){ alert(1); } window.onresize = function(){ alert

域物件建立銷燬的Listener

1.什麼是Servlet監聽器? 先來看看什麼是監聽器。監聽器是專門用於對其它物件身上發生的事件或狀態改變進行監聽和相應處理的物件,當被監視的物件發生情況時立即採取相應的行動。Servlet監聽器是Servlet規範中定義的一種特殊類,它用於監聽web應用程式的ServletContext,HttpSess

耳機的插入拔出問題

在接入容聯雲的視訊通訊預設第一次接入視訊的時候,是需要開啟擴音的,所以需要監聽耳機的插入和拔出問題。 程式碼如下: 第一步:清單檔案的配置 <receiver android:name=".rlyun.service.HeadsetPlugReceiver">

H5搖一搖手機傾斜事件(重力感應)

搖一搖功能(DeviceMotion) 搖一搖功能是很多原生APP都可以實現的功能,如微信中的搖一搖找好友,QQ音樂中的搖一搖換歌等。它們都是利用了手機加速感測器提供的API,當監聽到手機加速變化的事件時,根據獲取的加速值來執行不同的動作。 Web APP中HTML

JavaWeb_域物件建立銷燬的Listener1一d物件

1簡介 監聽器:專門用於對其他物件身上發生的事件或狀態改變進行監聽和相應處理的物件,當被見識的物件發生情況時,立即採取相應的行動。 Servlet監聽器:Servlet規範中定義的一種特殊類,它用於監

android webView滑動距離標題欄顏色漸變

重寫webView之 X5WebView import android.annotation.SuppressLint; import android.content.Context; import android.graphics.drawable.Drawable;

bootstrap滾動外掛Scrollspy橫向縱向例項對比

bootstrap滾動監聽(Scrollspy)外掛,即自動更新導航外掛,會根據滾動條的位置自動更新對應的導航目標。1.如何建立滾動監聽首先Body的position需要設定為relative.<body data-spy="scroll" data-target=".

HttpSessionListenerSession的建立失效

   Session建立事件發生在每次一個新的session建立的時候,類似地Session失效事件發生在每次一個Session失效的時候。 這個介面也只包含兩個方法,分別對應於Session的建立和失效: # public void sessionCreated(HttpSessionEvent se

使用HttpSessionListener介面Session的建立失效(可以用於統計線上人數)

轉自:http://uule.iteye.com/blog/824115 HttpSessionListener :    Session建立事件發生在每次一個新的session建立的時候,類似地Session失效事件發生在每次一個Session失效的時

使用HttpSessionListener介面Session的建立失效

HttpSessionListener :    Session建立事件發生在每次一個新的session建立的時候,類似地Session失效事件發生在每次一個Session失效的時候。 這個介面也只包含兩個方法,分別對應於Session的建立和失效: # public v

ionicandroid息屏後臺執行的生命週期

Hi,寶寶們,我又來了,我最近遇到一個問題,就是在ionic中監聽android的息屏、應用退出在後臺執行,之後重新進入應用的事件,這個寫過原生的都知道,android會在不用的時間,執行不同的生命週期,息屏(onPause->onStop),activity再次進入活

js滾動條事件獲取瀏覽器及螢幕高度寬度等資訊的方法

<!DOCTYPE html> <html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-sc

電話與螢幕鎖屏測試android7.0android8.0通過

android 8.0中將靜態廣播刪除了,不再生效,改用動態註冊廣播方式,電話監聽方式 //許可權: <uses-permission android:name="android.permission.PROCESS_OUTGOING_CAL