第一篇:linux c網(wǎng)絡網(wǎng)絡編程面試題收集
1.下列程序在32位linux或unix中的結(jié)果是什么?
func(char *str)
{
printf(“%d”,sizeof(str));
printf(“%d”,strlen(str));
}
main()
{
char a[]=“123456789”;
printf(“%d”,sizeof(a));
func(a);
}
答: 1049
網(wǎng)絡/網(wǎng)絡編程部份:
1、connect方法會阻塞,請問有什么方法可以避免其長時間阻塞?
答:最通 常的方法最有效的是加定時器;也可以采用非阻塞模式。
2、網(wǎng)絡中,如果客戶端突然掉線或者重啟,服務器端怎么樣才能立刻 知道?
答:若客戶端掉線或者重新啟動,服務器端會收到復位信號,每一種tcp/ip得實現(xiàn)不一樣,控制機制也不一樣。
3.在子網(wǎng)210.27.48.21/30種有多少個可用地址?分別是什么?
答:
簡:
30表示的是網(wǎng)絡號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。
詳:
210.27.48.21/30 代表的子網(wǎng)的網(wǎng)絡號是30位,即網(wǎng)絡號是210.27.48.21 & 255.255.255.251=210.27.48.20,此子網(wǎng)的地址空間是2位,即可以有4個地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一個地址的主機號(host number/id)是0,而主機號0代表的是multicast地址。最后一個地址的最后兩位是11,主機號每一位都為1代表的是廣播(broadcast)地址。所以只有中間兩個地址可以給host使用。其實那個問題本身不準確,廣播或multicast地止也是可以使用的地址,所以 回答4也應該正確,當然問的人也可能是想要你回答
2。我個人覺得最好的回答是一個廣播地址,一個multicast地址,2個unicast地址。
4.TTL 是什么?有什么用處,通常那些工具會用到它?(ping? traceroute? ifconfig? netstat?)
答:
簡:TTL 是Time To Live,一般是hup count,每經(jīng)過一個路由就會被減去一,如果它變成0,包會被丟掉。它的主要目的是防止包在有回路的網(wǎng)絡上死轉(zhuǎn),浪費網(wǎng)絡資源。ping和 traceroute用到它。
詳: TTL是Time To Live,目前是hup count,當包每經(jīng)過一個路由器它就會被減去一,如果它變成0,路由器就會把包丟掉。IP網(wǎng)絡往往帶有環(huán)(loop),比如子網(wǎng)A和子網(wǎng)B有兩個路由器 相連,它就是一個loop。TTL的主要目的是防止包在有回路的網(wǎng)絡上死轉(zhuǎn),因為包的TTL最終后變成0而使得此包從網(wǎng)上消失(此時往往路由器會送一個 ICMP包回來,traceroute就是根據(jù)這個做的)。ping會送包出去,所以里面有它,但是ping不一定非要不可它。traceroute則是 完全因為有它才能成的。ifconfig是用來配置網(wǎng)卡的,netstat-rn 是用來列路由表的,所以都用不著它
5.路由表示做什么用的?在linux環(huán)境中怎么來配置一條默認路由?
答:
簡:路由表是用來決定如何將包從一個子網(wǎng)傳送到 另一個子網(wǎng)的,換局話說就是用來決定從一個網(wǎng)卡接收到的包應該送的哪一張網(wǎng)卡上的。在Linux上可以用“route add default gw <默認路由器IP>”來配置一條默認路由。
詳: 路由表是用來決定如何將包從一個子網(wǎng)傳送到另一個子網(wǎng)的,換局話說就是用來決定從一個網(wǎng)卡接收到的包應該送的哪一張網(wǎng)卡上的。路由表的每一行至少有目標網(wǎng) 絡號、netmask、到這個子網(wǎng)應該使用的網(wǎng)卡。當路由器從一個網(wǎng)卡接收到一個包時,它掃描路由表的每一行,用里面的netmask和包里的目標IP地 址做并邏輯運算(&)找出目標網(wǎng)絡號,如果此網(wǎng)絡號和這一行里的網(wǎng)絡號相同就將這條路由保留下來做為備用路由,如果已經(jīng)有備用路由了就在這兩條路 由里將網(wǎng)絡號最長的留下來,另一條丟掉,如此接著掃描下一行直到結(jié)束。如果掃描結(jié)束任沒有找到任何路由,就用默認路由。確定路由后,直接將包送到對應的網(wǎng) 卡上去。在具體的實現(xiàn)中,路由表可能包含更多的信息為選路由算法的細節(jié)所用。題外話:路由算法其實效率很差,而且不scalable,解決辦法是使用IP 交換機,比如MPLS。
在Linux上可以用“route add default gw <默認路由器IP>”來配置一條默認路由。
6.在網(wǎng)絡中有兩臺主機A和B,并通過路由器和其他交換設備連接 起來,已經(jīng)確認物理連接正確無誤,怎么來測試這兩臺機器是否連通?如果不通,怎么來判斷故障點?怎么排除故障? 答:測試這兩臺 機器是否連通:從一臺機器ping另一臺機器
如果ping不通,用traceroute可以確定是哪個路由器不能連通,然后再找問題是在交換設備/hup/cable等。
7.網(wǎng)絡編程中設計并發(fā)服務器,使用多進程 與 多線程,請問有什么區(qū)別?
答案一:
1,進程:子進程是父進程的復制 品。子進程獲得父進程數(shù)據(jù)空間、堆和棧的復制品。
2,線程:相對與進程而言,線程是一個更加接近與執(zhí)行體的概念,它可以與同進程的其他線程共享數(shù) 據(jù),但擁有自己的棧空間,擁有獨立的執(zhí)行序列。
兩者都可以提高程序的并發(fā)度,提高程序運行效率和響應時間。
線程和進程在使用上各有優(yōu)缺 點:線程執(zhí)行開銷小,但不利于資源管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。
答案二:
根 本區(qū)別就一點:用多進程每個進程有自己的地址空間(address space),線程則共享地址空間。所有其它區(qū)別都是由此而來的:
1。速度: 線程產(chǎn)生的速度快,線程間的通訊快、切換快等,因為他們在同一個地址空間內(nèi)。
2。資源利用率:線程的資源利用率比較好也是因為他們在同一個地址空 間內(nèi)。
3。同步問題:線程使用公共變量/內(nèi)存時需要使用同步機制還是因為他們在同一個地址空間內(nèi)。
第二篇:C++ 面試題(服務器編程、網(wǎng)絡編程方便)
C++ 面試題-專注于服務器編程、網(wǎng)絡編程 C++ 面試題
1.類成員指針
Class test
{
Public:
Int fun(int)const;
Int fun(int);
Static int fun(int);
Int iTemp;
}
1.1非靜態(tài)成員函數(shù)指針定義:
int(Test::*pFun)(int)= &Test::fun;
int(Test::*pFunConst)(int)const = &Test::fun;
使用:
Test a;
const Test b;
(a.*pFun)(2)或(a.*pFunConst)(2);
(b.*pFunConst)(2);
不能用(b.*pFun)(2);
1.2非靜態(tài)成員變量int Test::*pInt = &Test::iTemp;
(a.*pInt)= 3;
1.3靜態(tài)成員函數(shù)指針int(*pFun)()= &Test::fun;
或 int(*pFun)()= Test::fun;都正確;(注:定義無域操作符)使用:
(*pFun)()或 pFun()都正確;
2.非成員函數(shù)指針和靜態(tài)成員函數(shù)一致。
3.非成員函數(shù)和靜態(tài)成員函數(shù)上不允許修飾符。例如 void fun()const;void fun()volatile;但非靜態(tài) 成員函數(shù)允許const、volatile等修飾符。
4.變量修飾符
auto:指定數(shù)據(jù)存儲在棧中。局部變量默認為auto。該修飾符不能用于成員變量和全局變量。
static: 局部變量表示存儲在靜態(tài)空間,全局變量表示不允許外部引用。
volatile:表示該變量可能隨時改變,不要做任何假設優(yōu)化。
mutale: 去除成員變量的const屬性。
extern:全局變量默認為extern屬性,表示可被外部引用,此時與static相對。
extern int a =2;表示定義一個可被外部引用的變量。
extern int a;表示引用外部變量。
5.數(shù)據(jù)類型隱式轉(zhuǎn)換
短數(shù)據(jù)->長數(shù)據(jù)(eg: float-> double)
有符號->無符號(eg: int-> unsigned int)PS: 所以 int(-1)>unsigned int(1);
低精度->高精度(eg: int-> float)
6.memcpy 有“防重疊”覆蓋機制,strcpy 沒有。
7.float表示
共計32位,折合4字節(jié)
由最高到最低位分別是第31、30、29、……、0位
31位是 符號位,1表示該數(shù)為負,0反之。
30-23位,一共8位是指數(shù)位。
22-0位,一共23位是尾數(shù)位。
每 8位分為一組,分成4組,分別是A組、B組、C組、D組。
每一組是一個字節(jié),在內(nèi)存中逆序存儲,即:DCBA
8.不能在類的聲明中初始化類常量,而只能在構(gòu)造函數(shù)初始化列表來初始化
9.類中的枚舉常量不占用對象的存儲空間
10.有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈式表達,可以附加返回值。
11.賦值函數(shù),應當用“引用傳遞”的方式返回String 對象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return 語句要把 *this 拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。
12.對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free 無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。如果用free 釋放“new 創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導致程序出錯。如果用delete 釋放“malloc 申請的動態(tài)內(nèi)存”,理論上講程序不會出錯,但是該程序的可讀性很差。
13.如果用new 創(chuàng)建對象數(shù)組,那么只能使用對象的無參數(shù)構(gòu)造函數(shù),delete時如果對象沒有析構(gòu)函數(shù),則delete和delete[]是功能相同的。
14.只能靠參數(shù)而不能靠返回值類型的不同來區(qū)分重載函數(shù)。編譯器根據(jù)參數(shù)為每個重載函數(shù)產(chǎn)生不同的內(nèi)部標識符。并不是兩個函數(shù)的名字相同就能構(gòu)成重載。全局函 數(shù)和類的成員函數(shù)同名不算重載,因為函數(shù)的作用域不同。
15.關鍵字inline
必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline 放在函數(shù)聲明前面不起任何作用。定義在類聲明之中的成員函數(shù)將自動地成為內(nèi)聯(lián)函數(shù)。
以下情況不宜使用內(nèi)聯(lián):
(1)如果函數(shù)體內(nèi)的代碼比較長,使用內(nèi)聯(lián)將導致內(nèi)存消耗代價較高。
(2)如果函數(shù)體 內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)體內(nèi)代碼的時間要比函數(shù)調(diào)用的開銷大。
16.只有靜態(tài)常量整型數(shù)據(jù)成員才可以在類中初始化,普通成員只能在初始化列表或函數(shù)內(nèi)初始化,常量成員只能在初始化列表。成員對象初始化的次序完全不受它們在 初始化表中次序的影響,只由成員對象在類中聲明的次序決定。
17.拷貝構(gòu)造函數(shù)和賦值函數(shù)非常容易混淆,常導致錯寫、錯用??截悩?gòu)造函數(shù)是在對象被創(chuàng)建時調(diào)用的,而賦值函數(shù)只能被已經(jīng)存在了的對象調(diào)用。
18.不想編寫拷貝構(gòu)造函數(shù)和賦值函數(shù),又不允許別人使用編譯器生成的,則只需將拷貝構(gòu)造函數(shù)和賦值函數(shù)聲明為私有函數(shù),不用編寫代碼。
19.“const T”和“T const”總是都被允許的,而且是等效的。
注意在常量指針(const pointer)中,“const”永遠出現(xiàn)在“*”之后。
例如:
int *const p1 = q;//指向int 變量的常量指針
int const* p2 = q;//指向int 常量的指針
const int* p3 = q;//指向int 常量的指針
20.一個常見的微妙問題是,一個函數(shù)風格的宏并不遵守函數(shù)參數(shù)傳遞的規(guī)則。
21.沒有引用數(shù)組,但可有指向數(shù)組的引用,并且保留數(shù)組的邊界。
22.左值擁有保存值的位置,而右值則沒有相關地址,只是簡單值。
23.負索引是可以的,如p[-2]或(-2)[p]都是可以的(p必然不能是數(shù)組名),但必須保持不越界。
sum=p()+q()+r();不能保證p(),q(),r()調(diào)用的順序。
逗號運算符“,”可以保證求值順序.result=(p(),q(),r());是先求p(),q(),然后將r()賦給result
24.在if的條件里聲明變量,且可在真假分支里面使用。
const int * const * p;p是個指針,指向常指針的,常指針指向一個常量int。
25.不能用空白初始化列表來規(guī)定默認的對象初始化.class a;
a A();//會警告,看起來像函數(shù)聲明
a *p=new a();//ok
a *p=new a;//ok
26.可以寫一句只有數(shù)字的代碼,如1234;(void)0;可以編譯執(zhí)行,相當于nop。
27.給函數(shù)指針賦值時可以對函數(shù)名取地址也可以不取,通過函數(shù)指針調(diào)用函數(shù)時可以用*也可不用。
28.static_cast可以轉(zhuǎn)換基本數(shù)據(jù)類型(int->char)、void*和有類型指針、基類和派生類指針的轉(zhuǎn)換(多重繼承也行,它可重新計算偏移地址),但是不能轉(zhuǎn)換如(int*->char*等)。
29.dynamic_cast主要用于執(zhí)行“安全的向下轉(zhuǎn)型”,reinterpret_cast可執(zhí)行任何轉(zhuǎn)換,const_cast執(zhí)行去 const轉(zhuǎn)換。
30.將取地址運算符用到完全限定的類成員名(包括變量和函數(shù)),就能獲得指向成員的地址。使用形式為“X::*”來聲明一個指向類X成員的指針。注意聲明成員 函數(shù)指針的時候不能像普通函數(shù)指針可以省略&或*的使用,但靜態(tài)成員函數(shù)則除外,它和普通函數(shù)一致。成員指針和普通指針不一樣,并非指向一個內(nèi)存 區(qū)域,而是相當于一個結(jié)構(gòu)的偏移量,當它和具體的對象結(jié)合就能指向特定對象的特定成員。
31.當把派生類對象賦給基類對象的時候會產(chǎn)生切割現(xiàn)象,即針對派生類的數(shù)據(jù)和行為將產(chǎn)生切割。
32.多維數(shù)組的第1個元素是數(shù)組而非普通類型。
33.在含有單參數(shù)構(gòu)造函數(shù)的類中注意隱式轉(zhuǎn)換。如String s=“Hello”;
34.函數(shù)對象是重載函數(shù)調(diào)用運算符的類對象。
35.引用需要用左值進行初始化,但指向常量的引用除外,編譯器將創(chuàng)建一個臨時左值。如const int c=12;//ok 一般情況下編譯器產(chǎn)生的臨時對象的生命期在它所在的最大表達式范圍內(nèi),但用臨時對象初始化常量對象的引用時會讓編譯器保證臨時對象和引用生命周期一樣。
36.可以將基類的成員指針(變量或函數(shù))安全的轉(zhuǎn)換為指向派生類成員的指針,但反之則不安全。
37.函數(shù)參數(shù)的傳遞是采用拷貝構(gòu)造函數(shù)而非賦值操作。對未初始化的對象賦值可能會出現(xiàn)意外,如類中含有未初始化指針。
38.聲明但不定義私有的拷貝構(gòu)造和賦值運算將會關閉類的復制操作。并且賦值運算、拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù)不會被繼承,對派生類重載賦值運算時需要調(diào)用基類的賦 值運算。
39.在構(gòu)造函數(shù)里對成員變量初始化,比較好的方式是使用初始化列表。在初始化列表中靜態(tài)成員和數(shù)組不能被初始化。
類的初始化順序是虛擬基類的成員->非虛基類成員->類自身成員,和初始化列表的順序無關。含有虛擬基類和不含的類在成員布局上不一樣,含有虛擬基類的類將虛擬基類的數(shù)據(jù)放在最后面。另外如B:virtual A,C:virtual A,D:B,C;(均是虛繼承)則D的構(gòu)造函數(shù)將對A初始化一次(即使在初始化列表沒有顯式初始化A),B,C將不再對A初始化。
所有靜態(tài)數(shù)據(jù)(全局變量和靜態(tài)存儲變量)在使用前如未初始化其值都為0.全局變量可以存儲在靜態(tài)初始化區(qū)和未初始化區(qū)。
40.RVO返回值優(yōu)化,是指在函數(shù)返回中執(zhí)行拷貝初始化到直接初始化(使用帶非對象參數(shù)的構(gòu)造函數(shù))的轉(zhuǎn)換,NRV和RVO類似,但使用命名局部變量來保存返 回值。p160
41.重載、覆蓋和隱藏的區(qū)別
重載的特征:在同一個類,函數(shù)名相同,參數(shù)不同,virtual可有可無。
覆蓋的特征:在兩個類(基類和派生類),函數(shù)名和參數(shù)都相同,且必須有virtual關鍵字。
隱藏的特征:基類函數(shù)名和派生類函數(shù)名相同參數(shù)不同,且不管是否有關鍵字?;蚝瘮?shù)名、參數(shù)均相同,但基類 函數(shù)沒有virtual(有的話就是覆蓋)。
不能覆蓋而只能隱藏基類非虛函數(shù)。
42.相同類型的所有對象公用一個虛函數(shù)表,在單繼承下不管有多少個虛函數(shù)都只有一個虛函數(shù)表指針。覆蓋就是在為派生類構(gòu)造虛函數(shù)表時用派生類的函數(shù)地址替換基 類成員函數(shù)地址的過程。
43.使用常量類成員可能在對類對象賦值的時候產(chǎn)生問題。
44.有時候我們可能會看到 if(NULL == p)這樣古怪的格式。不是程序?qū)戝e了,是程序員為了防止將 if(p == NULL)誤寫成 if(p = NULL),而有意把p 和NULL 顛倒。
第三篇:網(wǎng)絡編程實驗報告
實驗一 TCP Socket API程序設計
一、預備知識
1.網(wǎng)絡編程基本概念
網(wǎng)絡上的計算機間的通訊,實質(zhì)上是網(wǎng)絡中不同主機上的程序之間的通訊。在互聯(lián)網(wǎng)中使用IP地址來標識不同的主機,在網(wǎng)絡協(xié)議中使用端口號來標識主機上不同進程,即使用(IP地址,端口號)二元組。
套接字(Socket)用于描述IP地址和端口,是一個通信鏈的句柄,通信時一個網(wǎng)絡程序?qū)⒁獋鬏數(shù)囊欢涡畔懭胨谥鳈C的Socket中,該Socket通過與網(wǎng)絡接口卡相連的傳輸介質(zhì)將這段信息發(fā)送到另一臺主機的Socket中,以供其他程序使用。
圖1-1 TCP通信流程 2.TCP通信流程
TCP程序是面向連接的,程序運行后,服務器一直處于監(jiān)聽狀態(tài),客戶端與服務器通信之前必須首先發(fā)起連接請求,由服務器接收請求并在雙方之間建立連接后才可以互相通信。
二、實驗目的
1.了解Winsock API編程原理; 2.掌握TCP Socket程序的編寫; 3.了解C/S模式的特點; 4.學會解決實驗中遇到的問題。
三、實驗任務
使用Winsock API相關類實現(xiàn)TCP Socket通信程序,并能成功運行。
四、實驗環(huán)境及工具
1.Windows2000/XP/7 2.Visual C++開發(fā)平臺 3.Visual Studio2010
五、實驗內(nèi)容和步驟
參照《Visual C++網(wǎng)絡編程教程》書中81頁,TCP Socket API程序設計。連接:
void CChatClientDlg::OnConnect(){
WSADATA wsd;
//WSADATA結(jié)構(gòu)
WSAStartup(MAKEWORD(2,2),&wsd);
//加載協(xié)議,使用Winsock 2.2版
m_client = socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建流式套接字
//服務器地址
sockaddr_in serveraddr;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“請指定服務器IP!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“請指定端口!”);
return;
}
//獲取服務器進程的IP和端口
BYTE nFild[4];
CString sIP;
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//設置服務器地址結(jié)構(gòu)的內(nèi)容
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//發(fā)起連接須指明要訪問的服務器進程地址,這個地址存儲在serveraddr中
if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr))!= 0)
{
MessageBox(“連接失敗”);
return;
}
else
{
m_ListWords.AddString(“連接服務器成功!”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();}
“發(fā)送”按鈕事件過程代碼如下:
void CChatClientDlg::OnSend(){
//向服務器發(fā)送信息
UpdateData();
if(m_sWords.IsEmpty())
{
AfxMessageBox(“發(fā)送的消息不能為空!”);
return;
}
//開始發(fā)送數(shù)據(jù)
int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);
m_ListWords.AddString(“發(fā)送:” + m_sWords);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();} “清空”按鈕的事件過程: m_ListWords.ResetContent();“關于”按鈕的事件過程: CAboutDlg dlgAbout;dlgAbout.DoModal();
服務器端: 開始監(jiān)聽代碼:
void CChatServerDlg::OnListen(){
WSADATA wsd;
//WSADATA結(jié)構(gòu)
WSAStartup(MAKEWORD(2,2),&wsd);
//加載協(xié)議棧,使用Winsock 2.2版
m_server = socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建流式套接字
//將網(wǎng)絡中的事件關聯(lián)到窗口的消息函數(shù)中,定義消息號為20000,偵測客戶端的連接請求
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);
m_client = 0;
BYTE nFild[4];
CString sIP;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“請設置IP地址!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“請設置監(jiān)聽端口!”);
return;
}
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//服務器地址
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//綁定地址
if(bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr)))
{
MessageBox(“綁定地址失敗.”);
return;
}
//監(jiān)聽開始,服務器等待連接請求的到來
listen(m_server,5);
m_ListWords.AddString(“監(jiān)聽開始:”);
m_ListWords.AddString(“地址” + sIP + “ 端口” + sPort);
m_ListWords.AddString(“等待客戶端連接??”);
//界面完善
m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);
ServerIP.EnableWindow(false);
ServerPort.EnableWindow(false);
m_ButtonListen.EnableWindow(false);
m_ButtonStopListen.EnableWindow();
m_ButtonClear.EnableWindow();
m_ButtonExit.EnableWindow(false);} “停止監(jiān)聽”按鈕事件過程代碼如下: void CChatServerDlg::OnStopListen(){
//停止監(jiān)聽
closesocket(m_server);
m_ListWords.AddString(“停止監(jiān)聽”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);} “斷開”按鈕事件過程代碼如下: void CChatServerDlg::OnDisconnect(){
closesocket(m_client);
m_ListWords.AddString(“與客戶端斷開”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
//界面完善
m_ButtonDisconnect.EnableWindow();
m_EditWords.EnableWindow();
m_ButtonSend.EnableWindow();} ReceiveData()函數(shù)代碼如下:
void CChatServerDlg::ReceiveData(){
//接收客戶端的數(shù)據(jù)
char buffer[1024];
int num = recv(m_client,buffer,1024,0);
buffer[num] = 0;
CString sTemp;
sTemp.Format(“收到:%s”,buffer);
m_ListWords.AddString(sTemp);//顯示信息
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);//關閉與客戶端通信的Socket
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);//準備接收新的客戶端連接
//界面完善
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);} 服務器的初始化代碼如下: //界面初始化
m_ButtonStopListen.EnableWindow(false);m_ButtonDisconnect.EnableWindow(false);m_ButtonClear.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);
運行結(jié)果:
六、思考題
1.用Winsock API編程時,主要進行哪些通行的操作步驟? 2.闡述C/S模式的通信過程。答:
1.通行的操作
1.Winsock的打開(WSAStartup())。2.建立套接字(socket()或WSASocket())。3.地址綁定(bind())。
4.服務器監(jiān)聽連接(listen())。
5.客戶端提出連接申請(connect()或WSAConnect())。6.服務器接收客戶端的連接請求(accept()或WSAAccept())。7.數(shù)據(jù)的發(fā)送(send()或WSASend(),sendto()或WSASendTo())。8.數(shù)據(jù)的接收(recv()或WSARecv(),recvfrom()或WSARecvfrom())。9.關閉套接字(closesocket())。10.關閉Winsock(WSACleanup())。
2通信過程
第四篇:網(wǎng)絡工程師面試題
上海技術(shù)面試題總結(jié)
(一)? OSI七層模型?
答: 物理層:主要負責比特流的傳輸
數(shù)據(jù)鏈路層:鏈路連接的建立,拆除,分離。將數(shù)據(jù)封裝成幀。差錯檢測和恢復 網(wǎng)絡層:路由選擇和中繼
差錯檢測
流量控制 傳輸層:傳輸層提供了主機應用程序進程之間的端到端的服務
分割與重組數(shù)據(jù)、按端口號尋址、連接管理、差錯控制和流量控制
會話層:允許不同機器上的用戶之間建立會話關系,如WINDOWS 表示層:數(shù)據(jù)的表現(xiàn)形式,特定功能的實現(xiàn),如數(shù)據(jù)加密。應用層:用戶接口,提供用戶程序“接口”。? TCP/IP每層所使用的協(xié)議?
答:1)鏈路層,有時也稱作數(shù)據(jù)鏈路層或網(wǎng)絡接口層,通常包括操作系統(tǒng)中的設備驅(qū)動程序和計算機
中對應的網(wǎng)絡接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細節(jié)。2)網(wǎng)絡層,有時也稱作互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡中的活動,例如分組的選路。在 T C P / I P協(xié)議族中,網(wǎng)絡層協(xié)議包括I P協(xié)議(網(wǎng)際協(xié)議),I C M P協(xié)議(I n t e r n e t互聯(lián)網(wǎng)控 制報文協(xié)議),以及I G M P協(xié)議(I n t e r n e t組管理協(xié)議)。)運輸層主要為兩臺主機上的應用程序提供端到端的通信。在 T C P / I P協(xié)議族中,有兩個 互不相同的傳輸協(xié)議:T C P(傳輸控制協(xié)議)和U D P(用戶數(shù)據(jù)報協(xié)議)。
T C P為兩臺主機提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應用程序交給它的數(shù)據(jù)分 成合適的小塊交給下面的網(wǎng)絡層,確認接收到的分組,設置發(fā)送最后確認分組的超時時鐘 等。由于運輸層提供了高可靠性的端到端的通信,因此應用層可以忽略所有這些細節(jié)。而另一方面,U D P則為應用層提供一種非常簡單的服務。它只是把稱作數(shù)據(jù)報的分組 從一臺主機發(fā)送到另一臺主機,但并不保證該數(shù)據(jù)報能到達另一端。任何必需的可靠 性必須由應用層來提供。
這兩種運輸層協(xié)議分別在不同的應用程序中有不同的用途,這一點將在后面看到。)應用層負責處理特定的應用程序細節(jié)。幾乎各種不同的 T C P / I P實現(xiàn)都會提供下面這些 通用的應用程序:
Telnet 遠程登錄。FTP 文件傳輸協(xié)議。SMTP 簡單郵件傳送協(xié)議。SNMP 簡單網(wǎng)絡管理協(xié)議
數(shù)據(jù)鏈路層:ARP,RARP;網(wǎng)絡層: IP,ICMP,IGMP;傳輸層:TCP ,UDP,UGP;應用層:Telnet,FTP,SMTP,SNMP.1.怎么樣檢測TCP/IP正常運行 運行cmd,然后輸入ping 127.0.0.1
2.寫出568A.568B的線序
568A:綠白、綠、橙白、藍、藍白、橙、棕白、棕 568B:橙白、橙、綠白、藍、藍白、綠、棕白、棕 直通線一般都用A線序或B線序 交叉線一端是568A 一端 是568B
3.如果用戶的機器經(jīng)常出現(xiàn)藍屏的情況應該怎么辦
首先考慮軟件兼容性問題??梢詫④浖浞莸狡渌嬎銠C。然后刪除軟件。如果還不能解決就有可能是硬件兼容問題。先拔出不必要外設,比如打印機、掃描儀等等。再不行就是及其內(nèi)部硬件兼容問題了。如果不是軟件不是外設引起的藍屏那么大部分都是由內(nèi)存引起的??梢园蜗聝?nèi)存擦一下金手指?;蛘吒鼡Q其他內(nèi)存條看看
4.NAT(網(wǎng)絡地址轉(zhuǎn)換)有三種類型,靜態(tài)轉(zhuǎn)換,動態(tài)轉(zhuǎn)換,端口復用(PAT)。其中端口復用最為常用,一般配置在公司的接入路由器上。靜態(tài)轉(zhuǎn)換多于端口映射,用來將內(nèi)部的服務器發(fā)布出來
5.VLAN的作用
虛擬局域網(wǎng)。主要劃分廣播域用。交換機所有端口都處于相同廣播域。這樣隨著級聯(lián)交換機增多那么廣播域內(nèi)主機數(shù)也增多。廣播流量也隨之增加。為了有效控制廣播數(shù)量可以考慮用vlan來劃分廣播域。增加網(wǎng)絡安全性
6.內(nèi)網(wǎng)有60臺電腦(其中還有服務器),只有5個公網(wǎng)ip,怎么做讓內(nèi)網(wǎng)電腦上網(wǎng)
第一:采用動態(tài)地址轉(zhuǎn)換,由五個公網(wǎng)地址構(gòu)成一個地址池,內(nèi)網(wǎng)主機采用地址池中的地址上公網(wǎng),但同時只能有五臺主機能上公網(wǎng)。第二:采用端口地址轉(zhuǎn)換(PAT),創(chuàng)建五個地址池,每個地址池只有一個公網(wǎng)IP地址,將60臺主機按照管理策略分成五組,分別對應一個地址池.第三:采用端口地址轉(zhuǎn)換,全部60臺主機轉(zhuǎn)換成一個公網(wǎng)IP地址,其它四個公網(wǎng)地址留做它用.(也可以用5個公網(wǎng)IP)
7.某用戶不能和LAN通信
檢查物理連接。網(wǎng)卡燈是否正常。速率和雙工和交換機是還匹配。2.檢查MAC地址是否與其它主機沖突。3.檢查是否接入到了同一個VLAN里。4.檢查IP地址是否與其它主機沖突。
8.用戶可以訪問LAN 可不能上網(wǎng),為什么 1。檢查能否PING通網(wǎng)關。
2.檢查DNS服務器地址設置是否正確。3.使用NSLOOKUP進行域名解析。
4.殺毒。如網(wǎng)絡中有ARP病毒。5。檢查防火墻設置,再檢查用戶權(quán)限
9.C類地址有多少ip地址 B類地址有多少ip地址 C類256個IP地址(254個主機地址)B類65536個IP地址(65534個主機地址)10.常用端口號 20:ftp傳輸數(shù)據(jù) 21:ftp 建立連接 23:telnet,遠程管理 25:smtp,郵件收發(fā) 53:DNS,域名解析 80:http,網(wǎng)頁服務
110:pop,郵局協(xié)議,主要用于接收郵件
? MAC地址有幾位,工作在哪一層?
答:由42個二進制數(shù)字組成,一般用12個十六進制數(shù)字來寫,前六位是固定的廠商ID,后6位就代表地址;工作在數(shù)據(jù)鏈路層
? 列舉常見的路口掃描等安全產(chǎn)品
答:端口掃描軟件Xscan、superscan、流光 ? Windows管理員存在那個文件?
答:sam文件在 Windowssystem32config下 ? Windows的安全進程?
答:100Process: winlogon.exe [windows nt用戶登陸程序。]安全C:WINDOWSsystem32services.exe 100Process: lsass.exe [本地安全權(quán)限服務控制windows安全機制。]安全C:WINDOWSExplorer.EXE ? 算子網(wǎng)劃分 答:舉個例子:
172.16.18.5/19 它的子網(wǎng)掩碼的算法
172.16.18.5本來是B類地址,它的子網(wǎng)掩碼是255.255.0.0,也就是16位,但是現(xiàn)在是19位,那就是網(wǎng)絡位向主機位借了3位,那么16位的子網(wǎng)掩碼轉(zhuǎn)換為二進制是:11111111.11111111.00000000.00000000;19位的子網(wǎng)掩碼轉(zhuǎn)換為二進制是:11111111.11111111.11100000.00000000;再轉(zhuǎn)換為16進制是:255.255.224.0;
IP地址和子網(wǎng)掩碼做“與”運算:
172.16.18.5 : 10101100.10000000.1001000.10100000 255.255.224.0:11111111.11111111.11100000.00000000 網(wǎng)絡號: 10101100.10000000.10000000.00000000 轉(zhuǎn)換為十進制是:172.16.16.0 ? 交換機、路由器、集線器等設備工作在那一層? 答:交換機工作在數(shù)據(jù)鏈路層 路由器工作在網(wǎng)絡層
集線器工作在物理層
1、OSI參考模型分為7層
物理層、數(shù)據(jù)鏈路層、網(wǎng)絡層、傳輸層、會話層、表示層、應用層
1、在 windons server 2003 下若選擇安全登錄,則需要按(Ctrl+Alt+Del)組合鍵
2、按網(wǎng)絡的覆蓋范圍劃分,網(wǎng)絡可分為【局域網(wǎng)(LAN)、城域網(wǎng)(MAN)、廣域網(wǎng)(WAN)】
3、計算機中的數(shù)據(jù)都是以【二進制碼】形式發(fā)送的
4、ARP請求幀在物理網(wǎng)絡中是以【廣播】方式發(fā)送 1.1 [簡單說一下OSI七層]
Osi模型是一個工業(yè)的標準.它為現(xiàn)在的互聯(lián)網(wǎng)提供了很大的貢獻。是一個邏輯上的規(guī)范和標準,很多廠商都要遵循它。他定義了七層每一層都有不同的功能和規(guī)范。
--物理層
物理層定義了設備接口上的一些電子電氣化的標準,比如RJ45接口,光纖接口。傳輸介質(zhì)雙絞線,無線,光,電。等
--數(shù)據(jù)鏈路層
二層定義了一個重要的表示,MAC地址,準確的說他必須在一個LAN內(nèi)是唯一的。他又48位的十六進制組成,前24位是廠商表示,后24位 是廠商自定義的序列號。有時候 MAC地址就是表示了一個設備的位置。
--網(wǎng)絡層
網(wǎng)絡層是用來邏輯上選路尋址的,這一層最重要的一個協(xié)議就是IP協(xié)議?;趇p 又分為 ARP,RARP,ICMP,IGMP等
--傳輸層
這一層定義類了 兩個重要的協(xié)議 TCP和UDP。還有就是端口號的概念。這一層關聯(lián)的是一個主機上的某個程序或者是服務。比如 tcp 80 的web服務 udp 4000的QQ 程序等。
--會話層
主要作用是建立會話和管理會話。我一般這樣理解 會話的 比如 telnet 一臺主機,是一次會話的鏈接。打開百度的網(wǎng)頁,就和百度的服務器建立了一次會話。
--表示層
因為底層傳輸?shù)氖嵌M制,應用層無法直接識別。所以根據(jù)這一層的名字可以直接理解為他是一個翻譯。比如把一長串的數(shù)據(jù)“翻譯”成rmvb格式,交給上層的 快播 這個程序,把另一串數(shù)據(jù)“翻譯成”MP3格式交給 音樂播放器。其實這一層的工作很多。
壓縮,解壓縮,加密,解密等
--應用層
為用戶提供了一個可以操所的界面,如windows的桌面化或UNIX的字符界面。
OSI七層的每一層是獨立工作的,但是層與層之間是相互“合作”“兼容”的關系。1.2 [三層交換和路由器的不同]
雖說三層交換機和路由器都可以工作在三層,但本質(zhì)上還是有所區(qū)別。
一 在設計的功能上不同
現(xiàn)在有很多的多功能路由器,又能實現(xiàn)三層的路由功能,包括NAT地址轉(zhuǎn)換。有提供了二層的端口,有的還配置了無線功能。再有就是還具備防火墻的功能。但是你不能它單獨的劃分為交換機或者是防火墻吧。只能說是個多功能的路由器。防火墻二層交換只是他的附加功能。三層交換也一樣,主要功能還是解決局域網(wǎng)內(nèi)數(shù)據(jù)頻繁的通信,三層功能也有,但不見得和路由器差很多。
二 應用的環(huán)境不同
三層交換的路由功能比較簡單,因為更多的把他應用到局域網(wǎng)內(nèi)部的通信上,主要功能還是數(shù)據(jù)的交換
路由器的主要功能就是選路尋址,更適合于不同網(wǎng)絡之間,比如局域網(wǎng)和廣域網(wǎng)之間,或者是不同的協(xié)議之間。
三 實現(xiàn)方式不同
路由器能夠?qū)崿F(xiàn)三層的路由(或轉(zhuǎn)發(fā))是基于軟件的實現(xiàn)方式,當收到一個數(shù)據(jù)包要轉(zhuǎn)發(fā)的時候,要經(jīng)過查看路由表,最長匹配原則等一系列復雜的過程最終實現(xiàn)數(shù)據(jù)包的轉(zhuǎn)發(fā),相比三層交換效率略低。而三層交換是基于硬件的方式實現(xiàn)三層的功能,他成功轉(zhuǎn)發(fā)一個數(shù)據(jù)包后,就會記錄相應的IP和MAC的對應關系,當數(shù)據(jù)再次轉(zhuǎn)發(fā)是根據(jù)之前的記錄的表項直接轉(zhuǎn)發(fā)。這個過程成為“一次路由,多次交換”。
總之,三層交換和路由器的最大區(qū)別是路由器可以基于端口做NAT,而三層交換機不能。路由器直接接入光纖可以直接上網(wǎng),而三層交換機不能。主要是三層交換機的每一個接口都有專有的MAC地址和特定的ASIC集成電路。
.1.3 [靜態(tài)路由和動態(tài)路由的區(qū)別]
靜態(tài)路由特點
靜態(tài)路由是管理員手工配置,精確。但是不夠靈活,是單向性的??紤]到靜態(tài)路由穩(wěn)定,節(jié)省資源(內(nèi)存,cpu,鏈路帶寬)。在網(wǎng)絡TOP不是很大的環(huán)境中常用。
動態(tài)路由的特點
動態(tài)路由的好處就是路由器本身通過運行動態(tài)路由協(xié)議來互相學習路由條目,在大型的網(wǎng)絡環(huán)境中,一定程度上減少了工程師的工作量。動態(tài)路由協(xié)議分為很多種,IGP和EGP,IGP中根據(jù)工作的原理分為鏈路狀態(tài)型和距離矢量型的。但是不管哪一種動態(tài)協(xié)議,他都要經(jīng)過以下幾個過程。
1.“說話” 向其他的路由器發(fā)送路由信息
2.“收聽” 接收其他路由器發(fā)來的路由信息
3.“計算”不同的動態(tài)路由協(xié)議有不同的算法,每種路由協(xié)議通過自己特有的算法把收到的路由信息計算,得出最好的路由條目,加載到路由表中。
4.“維護” 維護路由表,當TOP發(fā)生變化的時候,及時的更新自己的路由表,并發(fā)送變更的消息
在生產(chǎn)環(huán)境下,應當更具不同的網(wǎng)絡規(guī)模,選擇不同的路由協(xié)議。的
第五篇:網(wǎng)絡編程實習作業(yè)
網(wǎng)絡編程實習作業(yè)
一. 實習內(nèi)容:
? 了解插口(socket)實現(xiàn)原理。
? 在某一種平臺(Linux,Unix系列或Windows系列)下進行網(wǎng)絡客戶機-服務器編程。
二. 主要參考書目:
? W.Richard Stevens, “UNIX Network Programming Networking APIs: Scokets and XTI(Volume 1,Second Edition)”,清華大學出版社 Prentice-Hall International, Inc.或其中文版 “UNIX網(wǎng)絡編程(第1卷,第2版)” 經(jīng)典讀物,目前的最新版是第三版
? Douglas Comer,《用TCP/IP進行網(wǎng)際互連 第3卷:客戶機-服務器編程和應用(第2版)》 或其英文版 Internetworking With TCP/IP Vol III: Client-Server Programming And Application(Second Edition)以下簡稱《客戶機-服務器編程》
三. 實習題目:
1:編寫DAYTIME服務的UDP客戶機和服務器的實現(xiàn)。
基本要求:
當服務器端收到客戶端的請求后,將當前daytime返回給客戶端,客戶端收到該回應后,將收到的daytime顯示到輸出中。
(其中在Linux或Unix環(huán)境中,當前daytime的獲得參考函數(shù)time()和ctime())
2:熟悉Http協(xié)議的請求和響應格式,編寫一個簡單的Http服務器。題目描述參考《自上而下計算機網(wǎng)絡》(第三版 作者James F.Kurose)第二章課后編程作業(yè)1。
基本要求:正確解析Http請求,實現(xiàn)簡單的GET請求回應。模擬一個對象(如:文件index.html)的GET回應(如:回應一個字符串),對于其他的對象,則根據(jù)Http響應格式回應對象不存在信息。3 通過瀏覽器可檢測自己的程序。如:輸入,查看其響應結(jié)果。對http請求的處理必須采用多進程實現(xiàn),即主進程負責等待請求連接,每當收到一個請求后,產(chǎn)生一個子進程對該請求做單獨處理,主進程繼續(xù)等待新請求,子進程在處理完其請求后結(jié)束自己。詳細要求參考課本要求。(多進程編程參考函數(shù)fork())
要求:
源程序部分帶有必要的注釋,備有一份文檔說明各個程序中的思路和關鍵技術(shù)。注意,只能使用C語言編寫??梢允莣indows或者linux下可執(zhí)行,二種環(huán)境選擇一種即可。
評分標準
90% 以上 :在程序說明文檔中,可以體現(xiàn)出自己對本程序所用到的技術(shù)有較深刻的理解。
程序有較好的可讀性(關鍵部分的注釋比較詳細)。
80% :符合要求,程序說明的比較詳細,思路比較清楚。
70% :只有程序沒有說明文檔的,70%-60% :缺少說明文檔
60% 以下 :程序或說明文檔完全和別人的一樣(抄襲于被抄襲者一樣處理)。
注:作業(yè)包括程序部分(.c,.cpp,.h等源碼和.exe等可執(zhí)行文件,不要.obj 等其他文件)和程序說明文檔,文件大小最好不要超過1M。程序說明要體現(xiàn)出你所用到的關鍵技術(shù),要說清楚自己定義函數(shù)的功能及實現(xiàn),要有關鍵部分的流程圖。要按時交作業(yè),晚交的要相應的扣分。請將程序打成一個包,包名統(tǒng)一采用“學號_姓名”形式,然后發(fā)到
network_tju@163.com
郵件的Title也是“學號_姓名”
請一定將學號放在前面
5截至日期:2009年4月20日
(注:1.以郵箱接收到的時間戳為準。2.在提交作業(yè)時,請最好選擇發(fā)送并保存郵件,避免由于投遞失敗而導致作業(yè)無法按時完成。(就是避免死無對證)3.杜絕抄襲,請盡早開始著手這項作業(yè))