日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

tcp c++ bind 端口_计算机端口到底是什么?

發(fā)布時間:2025/4/5 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tcp c++ bind 端口_计算机端口到底是什么? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
車總,我有個問題想向您請教一下。都說端口號是操作系統(tǒng)進行抽象,用來定位一個進程。那么當一臺主機上有兩張網(wǎng)卡時,每張網(wǎng)卡上綁定了一個IP地址。那么如果訪問不同IP地址的同一端口,比如80,應(yīng)該不會定位到同一個程序吧。那么端口號就應(yīng)該是針對于每一張網(wǎng)卡進行的進程抽象,而不是操作系統(tǒng)對每一個進程的抽象吧,不知道這樣子理解有沒有什么問題?

私信太多無法一一回復(fù),請各位見諒。這個問題特別有討論的價值,分享給有興趣的同學。當計算機接收到報文時,需要將這個報文遞交(Deliver)給某個特定的進程。計算機操作系統(tǒng)管理進程的方法,和公安系統(tǒng)管理人口很類似。為了唯一地識別一個公民,每個公民都有一個獨一無二的身份證號,比如31010xxxxxxxxxxx,每個號碼都是唯一的,這個身份證號就是人口管理系統(tǒng)的主鍵(Master Key)。只要把任意一個合法的身份證號輸入查詢系統(tǒng),返回值一定是一個,而不能是多個。如果有多個返回值,那么這個系統(tǒng)估計是假的!操作系統(tǒng),也給每個進程分配一個獨一無二的進程號(Process ID),其中包括操作系統(tǒng)自身的系統(tǒng)進程,以及由用戶執(zhí)行的用戶進程。如果報文里攜帶進程號,操作系統(tǒng)(TCP/IP協(xié)議棧)只要把報文轉(zhuǎn)交給該進程號對應(yīng)的進程就可以了。但是遺憾的是,報文里無論是以太幀頭、IP頭、TCP頭、以及應(yīng)用層并沒有攜帶進程號,那么操作系統(tǒng)如何能將報文準確無誤地轉(zhuǎn)交給真正的接收進程?這難不住機智而聰明的操作系統(tǒng)設(shè)計大師,大師給每個進程提前喊話:各位老少爺們,如果各位想與外界通信,必須使用Bind(address,port)函數(shù),將自己的進程號與本地的IP地址、端口號綁定起來。否則,后果自負!?注釋:上文的外界,可以是同一臺計算機上的其它進程,也可以是互聯(lián)網(wǎng)上的任何計算機上的進程。小弟(進程)聽到老大(操作系統(tǒng))發(fā)話,個個嚴格遵守規(guī)則。有一個進程A是這么做的:Bind (‘1.1.1.1’, 50007),這個系統(tǒng)調(diào)用消息攜帶該進程的進程號ID= 165364,發(fā)給了操作系統(tǒng)TCP/IP協(xié)議棧。操作系統(tǒng)懶洋洋地拿出一個本子記錄一下:(1.1.1.1,50007)--------165364注釋:1.1.1.1 是IP地址,50007是端口號稍后當操作系統(tǒng)TCP/IP協(xié)議棧接收到一個IP報文,通過提取目的IP地址(位于IP頭)、目的端口號(位于TCP頭),這兩者的組合恰好為(1.1.1.1,50007)。操作系統(tǒng)查詢一下小本子,立馬就得知這是進程號= 165364進程A的,然后通知該進程A前來將報文取走。進程B也想如法炮制:Bind (‘1.1.1.1’, 50007),很遺憾,操作系統(tǒng)拒絕了。拒絕的消息如下:“builtins.OSError: [WinError 10048] 通常每個套接字地址(協(xié)議/網(wǎng)絡(luò)地址/端口)只允許使用一次。”意味著(1.1.1.1, 50007)這個組合能唯一識別一個進程,這兩者的組合就是一個主鍵(Master Key)。通俗地說,在數(shù)據(jù)庫管理系統(tǒng),主鍵可以唯一鎖定一條記錄。進程B(進程ID= 168323)心有不甘,發(fā)現(xiàn)計算機還有其它接口地址2.2.2.2,于是通過Bind (‘2.2.2.2’, 50007),這次成功了。操作系統(tǒng)老爺爺又顫顫巍巍掏出小本子記錄了下來:(2.2.2.2,50007)--------168323這樣當有(2.2.2.2 , 50007)組合報文到達時,操作系統(tǒng)可以將其轉(zhuǎn)交給進程號= 168323的進程B。問題來了,進程A與進程B是什么關(guān)系?進程A、B可以是代碼完全不同的程序,也可以是代碼相同的程序,在自己獨立的內(nèi)存空間運行的不同實列(Instance)。好比你同時打開多個Word程序,這些Word程序使用相同的代碼,但是他們是多個Word實例。問題又來了,如果進程A的代碼真的是那樣編碼,如果放到其它計算機上執(zhí)行,會遇到問題,因為其它計算機的IP地址可能≠1.1.1.1。為了提高代碼的健壯性、可移植性,通常會使用這樣的代碼:Bind (‘ ’, 50007)其中‘ ’表示任何IP地址。換句話說,不Care計算機的接口IP地址。這個IP地址可以是127.0.0.1,也可以是1.1.1.1, 也可以是192.168.1.1,隨便多少都行。那么這個程序可以放到任何計算機上執(zhí)行。在同一臺機器上一個進程B也這樣執(zhí)行:Bind (‘ ’, 50007),可以哇?不可以,因為與進程A沖突!進程B可以Bind (‘ 1.1.1.1’, 50007),可以哇?同樣不可以,依然與進程A沖突。因為1.1.1.1是所有IP地址的子集。進程B心慌了,那怎么可以呢?操作系統(tǒng)老爺爺不緊不慢地說,只要別再使用端口50007就可以了。進程B于是執(zhí)行代碼如下:Bind (‘ ’, 50008),可以哇?恭喜你,當然可以!通常服務(wù)器代碼,都使用類似Bind (‘ ’, 50007) 方式執(zhí)行,所以50007這個端口號可以唯一識別一個進程,這就是端口號可以唯一識別進程號的由來!

總結(jié)

以上是生活随笔為你收集整理的tcp c++ bind 端口_计算机端口到底是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。