c++中内敛函数_C/C++求职者必备 23 道面试题,一道试题一份信心
1、 Static有什么用途?
(1)函數(shù)體內(nèi)static變量的作用范圍是該函數(shù)體,該變量的內(nèi)存只被分配一次,因此它的值在下次調(diào)用時(shí)不變;
(2)模塊內(nèi)的static全局變量同樣只能在該模塊內(nèi)的函數(shù)訪問(wèn)和調(diào)用,不能被模塊外的其他函數(shù)訪問(wèn);
(3)在類中的static成員變量屬于整個(gè)類所有,對(duì)類的所有對(duì)象只有一份拷貝,這個(gè)函數(shù)不接受this指針,因?yàn)橹荒芊秶惖膕tatic成員函數(shù)。
2、 const
1)不管在函數(shù)聲明修飾形參、還是修飾類的成員變量,表示該成員變量不能被改變,而且通常需要進(jìn)行初始化,因?yàn)橹蟛荒茉俑淖?#xff1b;
2)對(duì)于指針來(lái)說(shuō),可以修飾指針?biāo)赶虻淖兞?在*左邊,即指針指向內(nèi)容為常量),也可以指定指針本身為const(在*右邊,指針本身是常量),或者兩者同時(shí)指定為const(都是常量)。
3、 this指針
1)this指針本質(zhì)是一個(gè)函數(shù)參數(shù),只是編譯期隱藏起形式的,語(yǔ)法層面上的參數(shù),且this指針只能在成員函數(shù)中使用,全局函數(shù)、靜態(tài)函數(shù)都不能使用;
2)this在成員函數(shù)開(kāi)始前構(gòu)造,在成員結(jié)束后清楚;
3)This指針不占用對(duì)象的空間。
4、 ifndef/define/endif的作用
防止頭文件被重復(fù)引用和定義;
5、 C和C++的區(qū)別
1)C主要面向過(guò)程,C++面向?qū)ο?#xff1b;
2)C是一種結(jié)構(gòu)化語(yǔ)言,重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C主要考慮通過(guò)一個(gè)過(guò)程將輸入進(jìn)行各種運(yùn)算后得到輸出,C++主要考慮的是如何構(gòu)造一個(gè)對(duì)象模型,契合與之相對(duì)應(yīng)的問(wèn)題域,這樣就可以通過(guò)獲得對(duì)象的狀態(tài)信息得到輸出。
6、 C++函數(shù)值傳遞的方式
值傳遞、指針傳遞和引用傳遞
7、 extern “C”的作用
實(shí)現(xiàn)C和C++的混合編程;
因?yàn)楹瘮?shù)被C++編譯后在湖中的名字會(huì)變長(zhǎng),與C生成的不一致,造成C++不能直接調(diào)用C函數(shù)。
8、 struct 和class 的區(qū)別
1)struct的成員默認(rèn)是公有的,而類的成員默認(rèn)是私有的;
2)C中的struct不能包含成員函數(shù),C++中的class可以包含成員函數(shù)。
9、 new和malloc
1)都可用來(lái)申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存,都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內(nèi)存操作。
2)malloc和free是c語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符。
3)new會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù),delete 會(huì)調(diào)用對(duì)象的析構(gòu)函數(shù), 而malloc返回的都是void指針。
10、 heap與stack(堆與棧)的差別
1)heap是堆,stack是棧;
2)stack的空間由操作系統(tǒng)自動(dòng)分配和釋放,存放函數(shù)的參數(shù)值、 局部變量的值等。heap上的空間一般由程序員分配和釋放,并要指明大小;
3)棧空間有限而且是一塊連續(xù)的內(nèi)存區(qū)域,堆是很大的自由存儲(chǔ)區(qū);
4)C中的malloc函數(shù)分配的內(nèi)存空間就是在堆上,C++是new;
5)程序在編譯器對(duì)變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,且程序運(yùn)行過(guò)程中函數(shù)調(diào)用時(shí)的參數(shù)傳遞也在棧上進(jìn)行。
堆棧溢出原因
數(shù)組越界, 沒(méi)有回收內(nèi)存, 深層次遞歸調(diào)用
11、 Vector、list和deque的區(qū)別
Vector:表示一段連續(xù)的內(nèi)存區(qū)域,每個(gè)元素被順序存儲(chǔ)在這段內(nèi)存中,對(duì)vector的隨機(jī)訪問(wèn)效率很高,但對(duì)非末尾元素的插入和刪除則效率非常低。
list:表示非連續(xù)的內(nèi)存區(qū)域并通過(guò)一對(duì)指向首尾元素的指針雙向鏈接起來(lái),插入刪除效率高,隨機(jī)訪問(wèn)效率低。
deque:也表示一段連續(xù)的內(nèi)存區(qū)域,但與vector不同的是它支持高效地在其首部插入和刪除元素,它通過(guò)兩級(jí)數(shù)組結(jié)構(gòu)來(lái)實(shí)現(xiàn),一級(jí)表示實(shí)際的容器,第二級(jí)指向容器的首和尾。
12、 Vector和list的區(qū)別
vector擁有一段連續(xù)的內(nèi)存空間,能很好的支持隨機(jī)存取,因此vector::iterator支持“+”,“+=”,“
list的內(nèi)存空間可以是不連續(xù),它不支持隨機(jī)訪問(wèn),因此list::iterator則不支持“+”、“+=”、“
vector::iterator和list::iterator都重載了“++”運(yùn)算符。
總之,如果需要高效的隨機(jī)存取,而不在乎插入和刪除的效率,使用vector;如果需要大量的插入和刪除,而不關(guān)心隨機(jī)存取,則應(yīng)使用list。
13、 內(nèi)聯(lián)函數(shù)和宏的差別
內(nèi)聯(lián)函數(shù)和普通函數(shù)相比可以加快程序運(yùn)行的速度,因?yàn)椴恍枰袛嗾{(diào)用,在編譯的時(shí)候內(nèi)斂函數(shù)可以直接被鑲嵌到目標(biāo)代碼中。而宏只是一個(gè)簡(jiǎn)單的替換。
內(nèi)聯(lián)函數(shù)要做參數(shù)類型檢查,這是內(nèi)聯(lián)函數(shù)的優(yōu)勢(shì);
inline是指嵌入代碼,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn),而是把代碼直接寫(xiě)到那里去。
對(duì)于短小的代碼來(lái)說(shuō)inline增加空間消耗換來(lái)的是效率提高,這方面和宏是一模一樣的,但是inline在和宏相比沒(méi)有付出任何額外代價(jià)的情況下更安全。至于是否需要inline函數(shù),就需要根據(jù)實(shí)際情況來(lái)取舍了。
inline一般只用于如下情況:
(1)一個(gè)函數(shù)不斷被重復(fù)調(diào)用。
(2)函數(shù)只有簡(jiǎn)單的幾行,且函數(shù)內(nèi)不包含for、 while、 switch語(yǔ)句。
一般來(lái)說(shuō),我們寫(xiě)小程序沒(méi)有必要定義成inline,但是如果要完成一個(gè)工程項(xiàng)目,當(dāng)一個(gè)簡(jiǎn)單函數(shù)被調(diào)用多次時(shí),則應(yīng)該考慮用inline。
宏在C語(yǔ)言里極其重要,而在C++里用得就少多了。關(guān)于宏的第一規(guī)則是絕不應(yīng)該去使用它,除非你不得不這樣做。幾乎每個(gè)宏都表明了程序設(shè)計(jì)語(yǔ)言里、 程序里或者程序員的一個(gè)缺陷,因?yàn)樗鼘⒃诰幾g器看到程序的正文之前重新擺布這些正文。宏也是許多程序設(shè)計(jì)工具的主要麻煩。所以,如果你使用了宏,就應(yīng)該準(zhǔn)備只能從各種工具(如排錯(cuò)系統(tǒng)、 交叉引用系統(tǒng)、 輪廓程序等)中得到較少的服務(wù)。
宏是在代碼處不加任何驗(yàn)證的簡(jiǎn)單替代,而內(nèi)聯(lián)函數(shù)是將代碼直接插入調(diào)用處,而減少了普通函數(shù)調(diào)用時(shí)的資源消耗。
宏不是函數(shù),只是在編譯前(編譯預(yù)處理階段)將程序中有關(guān)字符串替換成宏體。
關(guān)鍵字inline必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline放在函數(shù)聲明前面不起任何作用。
inline是一種“用于實(shí)現(xiàn)的關(guān)鍵字”,而不是一種“用于聲明的關(guān)鍵字”。內(nèi)聯(lián)能提高函數(shù)的執(zhí)行效率,至于為什么不把所有的函數(shù)都定義成內(nèi)聯(lián)函數(shù)?如果所有的函數(shù)都是內(nèi)聯(lián)函數(shù),還用得著“內(nèi)聯(lián)”這個(gè)關(guān)鍵字嗎?內(nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),僅僅省去了函數(shù)調(diào)用的開(kāi)銷,從而提高函數(shù)的執(zhí)行效率。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開(kāi)銷較大,那么效率的收獲會(huì)很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更多的內(nèi)存空間。
以下情況不宜使用內(nèi)聯(lián):
1 如果函數(shù)體內(nèi)的代碼比較長(zhǎng),使用內(nèi)聯(lián)將導(dǎo)致內(nèi)存消耗代價(jià)較高。2 如果函數(shù)體內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間要比函數(shù)調(diào)用的開(kāi)銷大。類的構(gòu)造函數(shù)和析構(gòu)函數(shù)容易讓人誤解成使用內(nèi)聯(lián)更有效。要當(dāng)心構(gòu)造函數(shù)和析構(gòu)函數(shù)可能會(huì)隱藏一些行為,如“偷偷地”執(zhí)行了基類或成員對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)。所以不要隨便地將構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義體放在類聲明中。一個(gè)好的編譯器將會(huì)根據(jù)函數(shù)的定義體,自動(dòng)地取消不值得的內(nèi)聯(lián)(這進(jìn)一步說(shuō)明了inline不應(yīng)該出現(xiàn)在函數(shù)的聲明中)。
14、 引用和指針的區(qū)別
1)指針是一個(gè)變量,存放地址的變量,指向內(nèi)存的一個(gè)存儲(chǔ)單元,引用僅是別名;
2)引用必須初始化,指針不必;
3)不存在指向空值的引用,但是存在指向空值的指針;
4)sizeof引用對(duì)象得到的是所指對(duì)象,變量的大小,sizeof指針得到是指針本身的大小;
5)內(nèi)存分配上,程序?yàn)橹羔樂(lè)峙鋬?nèi)存,不用為引用分配內(nèi)存。
15、 數(shù)組和鏈表的區(qū)別
C++語(yǔ)言中可以用數(shù)組處理一組數(shù)據(jù)類型相同的數(shù)據(jù),但在使用數(shù)組之前必須確定數(shù)組的大小。而在實(shí)際應(yīng)用中,用戶使用數(shù)組之前有時(shí)無(wú)法準(zhǔn)確確定數(shù)組的大小,只能將數(shù)組定義成足夠大小,這樣數(shù)組中有些空間可能不被使用,從而造成內(nèi)存空間的浪費(fèi)。
鏈表是一種常見(jiàn)的數(shù)據(jù)組織形式,它采用動(dòng)態(tài)分配內(nèi)存的形式實(shí)現(xiàn)。需要時(shí)可以用new分配內(nèi)存空間,不需要時(shí)用delete將已分配的空間釋放,不會(huì)造成內(nèi)存空間的浪費(fèi)。
從邏輯結(jié)構(gòu)來(lái)看:
數(shù)組必須事先定義固定的長(zhǎng)度(元素個(gè)數(shù)),不能適應(yīng)數(shù)據(jù)動(dòng)態(tài)的增減的情況,即數(shù)組的大小一旦定義就不能改變。當(dāng)數(shù)據(jù)增加時(shí),可能超出原先 定義的元素個(gè)數(shù);當(dāng)數(shù)據(jù)減少時(shí),造成內(nèi)存浪費(fèi);
鏈表動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配,可以適應(yīng)數(shù)據(jù)動(dòng)態(tài)地增減的情況,且可以方便地插入、刪除數(shù)據(jù)項(xiàng)。(數(shù)組中插入、刪除數(shù)據(jù)項(xiàng)時(shí),需要移動(dòng)其它數(shù)據(jù)項(xiàng))。
從內(nèi)存存儲(chǔ)來(lái)看:
靜態(tài)數(shù)組從棧中分配空間(用NEW創(chuàng)建的在堆中),對(duì)于程序員方便快速,但是自由度小;
鏈表從堆中分配空間, 自由度大,但是申請(qǐng)管理比較麻煩。
從訪問(wèn)方式來(lái)看:
數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,因此,可以利用下標(biāo)索引進(jìn)行隨機(jī)訪問(wèn);
鏈表是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),在訪問(wèn)元素的時(shí)候只能通過(guò)線性的方式由前到后順序訪問(wèn),所以訪問(wèn)效率比數(shù)組要低。
16、 鏈表
鏈表是否有環(huán)
算法的思想是使用追趕的方法設(shè)定兩個(gè)指針p, q,其中p每次向前移動(dòng)一步,q每次向前移動(dòng)兩步。那么如果單鏈表存在環(huán),則p和q相遇;否則q將首先遇到null退出。
如何知道環(huán)的長(zhǎng)度
記錄下上個(gè)問(wèn)題的碰撞點(diǎn)p,slow、fast從該點(diǎn)開(kāi)始,再次碰撞所走過(guò)的操作數(shù)就是環(huán)的長(zhǎng)度s。
如何找出環(huán)的連接點(diǎn)
有定理:碰撞點(diǎn)p到連接點(diǎn)的距離=頭指針到連接點(diǎn)的距離,因此,分別從碰撞點(diǎn)、頭指針開(kāi)始走,相遇的那個(gè)點(diǎn)就是連接點(diǎn)。
帶環(huán)鏈表的長(zhǎng)度
根據(jù)已經(jīng)求出連接點(diǎn)距離頭指針的長(zhǎng)度,加上求出的環(huán)的長(zhǎng)度,二者之和就是帶環(huán)單鏈表的長(zhǎng)度
單鏈表的逆置
17、 重載和重寫(xiě)(覆蓋)的區(qū)別
從定義來(lái)說(shuō):
重載:是指存在多個(gè)重名函數(shù),而這些函數(shù)的參數(shù)表不同(參數(shù)個(gè)數(shù),類型不同);
重寫(xiě):是指子類重新定義父類虛函數(shù)的方法。
從實(shí)現(xiàn)原理上來(lái)說(shuō):
重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)。而函數(shù)的調(diào)用,在編譯時(shí)就已經(jīng)確定是靜態(tài)的,也就是說(shuō)它們的地址在編譯期就綁定(早綁定),因此重載與多態(tài)無(wú)關(guān)。
重寫(xiě):和多態(tài)有關(guān)。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類指針,動(dòng)態(tài)地調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無(wú)法確定的(調(diào)用的子類的虛函數(shù)的地址無(wú)法給出)。因此,它們的地址是在運(yùn)行期綁定的(晚綁定)。
18、 封裝、繼承、多態(tài)、虛函數(shù)
封裝
封裝是實(shí)現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)的第一步,封裝就是將數(shù)據(jù)或函數(shù)等集合在一個(gè)個(gè)的單元(類)中。其意義在于保護(hù)或者放著代碼被無(wú)意中破壞
繼承
繼承主要實(shí)現(xiàn)重用代碼,擴(kuò)展已存在的代碼,節(jié)省開(kāi)發(fā)時(shí)間。子類可以繼承父類的一些東西。
多態(tài)
定義:“一個(gè)接口,多種方法”,程序運(yùn)行時(shí)才決定調(diào)用的函數(shù)
實(shí)現(xiàn):C++多態(tài)主要是通過(guò)虛函數(shù)實(shí)現(xiàn)。虛函數(shù)允許子類重寫(xiě)。
目的:封裝可以使代碼模塊化,繼承可以擴(kuò)展已存在的代碼,它們的目的都是為了代碼重用。而多態(tài)的目的是為了接口重用,將接口與實(shí)現(xiàn)分離。
多態(tài)的基礎(chǔ)是繼承,需要虛函數(shù)的支持。子類繼承父類大部分的資源,不能繼承的有構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù), operator=函數(shù),友元函數(shù)等等
虛函數(shù)
定義:被virtual關(guān)鍵字修飾的成員函數(shù),就是虛函數(shù)。其作用就是實(shí)現(xiàn)多態(tài)性。
為什么虛函數(shù)效率低?
因?yàn)樘摵瘮?shù)需要一次間接的尋址,而一般的函數(shù)可以在編譯時(shí)定位到函數(shù)的地址,虛函數(shù)(動(dòng)態(tài)類型調(diào)用)要根據(jù)某個(gè)指針定位到函數(shù)的地址。多增加了一個(gè)過(guò)程,效率雖然會(huì)低一些,但帶來(lái)了運(yùn)行時(shí)的多態(tài)。
為什么要用純虛函數(shù)?
在很多情況下,基類本身生成對(duì)象是不合情理的。例如,動(dòng)物作為一個(gè)基類可以派生出老虎、孔雀等子類,但動(dòng)物本身生成對(duì)象明顯不合常理。為了解決這個(gè)問(wèn)題,方便使用類的多態(tài)性,引入了純虛函數(shù)的概念,將函數(shù)定義為純虛函數(shù)。則編譯器要求在派生類中必須予以重寫(xiě)以實(shí)現(xiàn)多態(tài)性。同時(shí)含有純虛擬函數(shù)的類稱為抽象類,它不能生成對(duì)象。
使用純虛數(shù)的情況:
1)當(dāng)想在基類中抽象出一個(gè)方法,且該基類只做能被繼承,而不能被實(shí)例化;
2)這個(gè)方法必須在派生類(derived class)中被實(shí)現(xiàn);
虛函數(shù)與純虛函數(shù)的區(qū)別
虛函數(shù)是為了重載和多態(tài)。在基類中是有定義的,即便定義為空。在子類中可以重寫(xiě)。
純序函數(shù)在基類中沒(méi)有定義,必須在子類中加以實(shí)現(xiàn)。
多態(tài)的基礎(chǔ)是繼承,需要虛函數(shù)的支持。子類繼承父類大部分的資源,不能繼承的有構(gòu)造函數(shù),析構(gòu)函數(shù),拷貝構(gòu)造函數(shù), operator=函數(shù),友元函數(shù)等等。
19、 內(nèi)存
內(nèi)存類別
棧 –由編譯器自動(dòng)分配釋放, 局部遍歷存放位置
堆 –由程序員分配和釋放.
全局區(qū)(靜態(tài)區(qū)) –全局變量和靜態(tài)變量的存儲(chǔ)是放在一起的, 初始化的全局變量和static靜態(tài)變量在一塊區(qū)域.
程序代碼區(qū) –存放二進(jìn)制代碼.
內(nèi)存分配方式
靜態(tài)存儲(chǔ)區(qū),程序編譯時(shí)便分好, 整個(gè)運(yùn)行期間都存在,比如全局變量,常量;
棧上分配;
堆上分配。
內(nèi)存泄漏
原因:動(dòng)態(tài)分配的內(nèi)存沒(méi)有手動(dòng)釋放完全。
避免:使用的時(shí)候應(yīng)記得指針的長(zhǎng)度; 分配多少內(nèi)存應(yīng)記得釋放多少, 保證一一對(duì)應(yīng)的關(guān)系; 動(dòng)態(tài)分配內(nèi)存的指針最好不要再次賦值.
20、 進(jìn)程和線程的差別
進(jìn)程是最小的分配資源單位,線程是最小的執(zhí)行單位。
進(jìn)程是程序的一次執(zhí)行。線程可以理解為進(jìn)程中執(zhí)行的一段程序片段。在一個(gè)多任務(wù)環(huán)境中下面的概念可以幫助我們理解兩者間的差別。
進(jìn)程間是獨(dú)立的,這表現(xiàn)在內(nèi)存空間、 上下文環(huán)境上;線程運(yùn)行在進(jìn)程空間內(nèi)。一般來(lái)講(不使用特殊技術(shù)),進(jìn)程無(wú)法突破進(jìn)程邊界存取其他進(jìn)程內(nèi)的存儲(chǔ)空間;而線程由于處于進(jìn)程空間內(nèi),所以同一進(jìn)程所產(chǎn)生的線程共享同一內(nèi)存空間。
同一進(jìn)程中的兩段代碼不能夠同時(shí)執(zhí)行,除非引入線程。
線程是屬于進(jìn)程的,當(dāng)進(jìn)程退出時(shí)該進(jìn)程所產(chǎn)生的線程都會(huì)被強(qiáng)制退出并清除。線程占用的資源要少于進(jìn)程所占用的資源。進(jìn)程和線程都可以有優(yōu)先級(jí)。
21、 TCP和UDP
TCP是傳輸控制協(xié)議,提供的是面向連接、 可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā)、 丟棄重復(fù)數(shù)據(jù)、 檢驗(yàn)數(shù)據(jù)、 流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。
UDP是用戶數(shù)據(jù)包協(xié)議,是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)包的運(yùn)輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)包發(fā)送出去,但是并不保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)包前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒(méi)有超時(shí)重發(fā)等機(jī)制,故而傳輸速度很快。
22、 編寫(xiě)Socket套接字
Socket相當(dāng)于進(jìn)行網(wǎng)絡(luò)通信兩端的插座,只要對(duì)方的Socket和自己的Socket有通信聯(lián)接,雙方就可以發(fā)送和接收數(shù)據(jù)了。如果你要編寫(xiě)的是一個(gè)服務(wù)程序,那么先調(diào)用socket()創(chuàng)建一個(gè)套接字,調(diào)用bind()綁定IP地址和端口,然后啟動(dòng)一個(gè)死循環(huán),循環(huán)中調(diào)用accept()接受連接。對(duì)于每個(gè)接受的連接,可以啟動(dòng)多線程方式進(jìn)行處理,在線程中調(diào)用send()、 recv()發(fā)送和接收數(shù)據(jù)。
如果你要編寫(xiě)的是一個(gè)客戶端程序,那么就簡(jiǎn)單多了。先調(diào)用socket()創(chuàng)建一個(gè)套接字,然后調(diào)用connect()連接服務(wù)器,之后就是調(diào)用send()、 recv()發(fā)送和接收數(shù)據(jù)了。
服務(wù)器端程序編寫(xiě):
(1)調(diào)用ServerSocket(int port)創(chuàng)建一個(gè)服務(wù)器端套接字,并綁定到指定端口上。
(2)調(diào)用accept(),監(jiān)聽(tīng)連接請(qǐng)求,則接收連接,返回通信套接字。
(3)調(diào)用Socket類的getOutStream()和getInputStream獲取輸出流和輸入流,開(kāi)始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收。
(4)關(guān)閉通信套接字.Socket.close()。
客戶端程序編寫(xiě):
(1)調(diào)用Socket()創(chuàng)建一個(gè)流套接字,并連接到服務(wù)器端。
(2)調(diào)用Socket類的getOutputStream()和fetInputStream獲取輸出流和輸入流,開(kāi)始網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收。
(3)關(guān)閉通信套接字.Socket.close()。
23、 三次握手和四次揮手
1、建立連接協(xié)議(三次握手)
(1)客戶端發(fā)送一個(gè)帶SYN標(biāo)志的TCP報(bào)文到服務(wù)器。這是三次握手過(guò)程中的報(bào)文1。
(2)服務(wù)器端回應(yīng)客戶端的,這是三次握手中的第2個(gè)報(bào)文,這個(gè)報(bào)文同時(shí)帶ACK標(biāo)志和SYN標(biāo)志。因此它表示對(duì)剛才客戶端SYN報(bào)文的回應(yīng);同時(shí)又標(biāo)志SYN給客戶端,詢問(wèn)客戶端是否準(zhǔn)備好進(jìn)行數(shù)據(jù)通訊。
(3)客戶必須再次回應(yīng)服務(wù)段一個(gè)ACK報(bào)文,這是報(bào)文段3。
2、連接終止協(xié)議(四次握手)
由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。
(1) TCP客戶端發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶到服務(wù)器的數(shù)據(jù)傳送(報(bào)文段4)。
(2) 服務(wù)器收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。
(3) 服務(wù)器關(guān)閉客戶端的連接,發(fā)送一個(gè)FIN給客戶端(報(bào)文段6)。
(4) 客戶端發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)。
總結(jié)
以上是生活随笔為你收集整理的c++中内敛函数_C/C++求职者必备 23 道面试题,一道试题一份信心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法前戏 递归 二分查找 列表查找
- 下一篇: 短视频网站源码干货分享:如何实现背景音乐