linux C 網(wǎng)絡(luò)編程面試題
基礎(chǔ)部份:
1.下列程序在32位linux或unix中的結(jié)果是什么?
func(char *str)
{
printf("%d",sizeof(str));
printf("%d",strlen(str));
}
網(wǎng)絡(luò)/網(wǎng)絡(luò)編程部份:
1、connect方法會阻塞,請問有什么方法可以避免其長時(shí)間阻塞?
答:最通常的方法最有效的是加定時(shí)器;也可以采用非阻塞模式。
2、網(wǎng)絡(luò)中,如果客戶端突然掉線或者重啟,服務(wù)器端怎么樣才能立刻知道?
答:若客戶端掉線或者重新啟動(dòng),服務(wù)器端會收到復(fù)位信號,每一種tcp/ip得實(shí)現(xiàn)不一樣,控制機(jī)制也不一樣。
3.在子網(wǎng)210.27.48.21/30種有多少個(gè)可用地址?分別是什么?
答:
簡:
30表示的是網(wǎng)絡(luò)號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。
詳:
210.27.48.21/30 代表的子網(wǎng)的網(wǎng)絡(luò)號是30位,即網(wǎng)絡(luò)號是210.27.48.21 & 255.255.255.251=210.27.48.20,此子網(wǎng)的地址空間是2位,即可以有4個(gè)地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一個(gè)地址的主機(jī)號(host number/id)是0,而主機(jī)號0代表的是multicast地址。最后一個(gè)地址的最后兩位是11,主機(jī)號每一位都為1代表的是廣播 (broadcast)地址。所以只有中間兩個(gè)地址可以給host使用。其實(shí)那個(gè)問題本身不準(zhǔn)確,廣播或multicast地止也是可以使用的地址,所以 回答4也應(yīng)該正確,當(dāng)然問的人也可能是想要你回答2。我個(gè)人覺得最好的回答是一個(gè)廣播地址,一個(gè)multicast地址,2個(gè)unicast地址。
4.TTL是什么?有什么用處,通常那些工具會用到它?(ping? traceroute? ifconfig? netstat?)
答:
簡:TTL是Time To Live,一般是hup count,每經(jīng)過一個(gè)路由就會被減去一,如果它變成0,包會被丟掉。它的主要目的是防止包在有回路的網(wǎng)絡(luò)上死轉(zhuǎn),浪費(fèi)網(wǎng)絡(luò)資源。ping和traceroute用到它。
詳:TTL 是Time To Live,目前是hup count,當(dāng)包每經(jīng)過一個(gè)路由器它就會被減去一,如果它變成0,路由器就會把包丟掉。IP網(wǎng)絡(luò)往往帶有環(huán)(loop),比如子網(wǎng)A和子網(wǎng)B有兩個(gè)路由器 相連,它就是一個(gè)loop。TTL的主要目的是防止包在有回路的網(wǎng)絡(luò)上死轉(zhuǎn),因?yàn)榘腡TL最終后變成0而使得此包從網(wǎng)上消失(此時(shí)往往路由器會送一個(gè) ICMP包回來,traceroute就是根據(jù)這個(gè)做的)。ping會送包出去,所以里面有它,但是ping不一定非要不可它。traceroute則是 完全因?yàn)橛兴拍艹傻摹fconfig是用來配置網(wǎng)卡的,netstat -rn 是用來列路由表的,所以都用不著它
5.路由表示做什么用的?在linux環(huán)境中怎么來配置一條默認(rèn)路由?
答:
簡:路由表是用來決定如何將包從一個(gè)子網(wǎng)傳送到另一個(gè)子網(wǎng)的,換局話說就是用來決定從一個(gè)網(wǎng)卡接收到的包應(yīng)該送的哪一張網(wǎng)卡上的。在Linux上可以用“route add default gw <默認(rèn)路由器IP>”來配置一條默認(rèn)路由。
詳: 路由表是用來決定如何將包從一個(gè)子網(wǎng)傳送到另一個(gè)子網(wǎng)的,換局話說就是用來決定從一個(gè)網(wǎng)卡接收到的包應(yīng)該送的哪一張網(wǎng)卡上的。路由表的每一行至少有目標(biāo)網(wǎng) 絡(luò)號、netmask、到這個(gè)子網(wǎng)應(yīng)該使用的網(wǎng)卡。當(dāng)路由器從一個(gè)網(wǎng)卡接收到一個(gè)包時(shí),它掃描路由表的每一行,用里面的netmask和包里的目標(biāo)IP地 址做并邏輯運(yùn)算(&)找出目標(biāo)網(wǎng)絡(luò)號,如果此網(wǎng)絡(luò)號和這一行里的網(wǎng)絡(luò)號相同就將這條路由保留下來做為備用路由,如果已經(jīng)有備用路由了就在這兩條路 由里將網(wǎng)絡(luò)號最長的留下來,另一條丟掉,如此接著掃描下一行直到結(jié)束。如果掃描結(jié)束任沒有找到任何路由,就用默認(rèn)路由。確定路由后,直接將包送到對應(yīng)的網(wǎng) 卡上去。在具體的實(shí)現(xiàn)中,路由表可能包含更多的信息為選路由算法的細(xì)節(jié)所用。題外話:路由算法其實(shí)效率很差,而且不scalable,解決辦法是使用IP 交換機(jī),比如MPLS。
在Linux上可以用“route add default gw <默認(rèn)路由器IP>”來配置一條默認(rèn)路由。
6.在網(wǎng)絡(luò)中有兩臺主機(jī)A和B,并通過路由器和其他交換設(shè)備連接起來,已經(jīng)確認(rèn)物理連接正確無誤,怎么來測試這兩臺機(jī)器是否連通?如果不通,怎么來判斷故障點(diǎn)?怎么排除故障?
答:測試這兩臺機(jī)器是否連通:從一臺機(jī)器ping另一臺機(jī)器
如果ping不通,用traceroute可以確定是哪個(gè)路由器不能連通,然后再找問題是在交換設(shè)備/hup/cable等。
7.網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器,使用多進(jìn)程 與 多線程 ,請問有什么區(qū)別?
答案一:
1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。
2,線程:相對與進(jìn)程而言,線程是一個(gè)更加接近與執(zhí)行體的概念,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。
兩者都可以提高程序的并發(fā)度,提高程序運(yùn)行效率和響應(yīng)時(shí)間。
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。
答案二:
根本區(qū)別就一點(diǎn):用多進(jìn)程每個(gè)進(jìn)程有自己的地址空間(address space),線程則共享地址空間。所有其它區(qū)別都是由此而來的:
1。速度:線程產(chǎn)生的速度快,線程間的通訊快、切換快等,因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。
2。資源利用率:線程的資源利用率比較好也是因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。
3。同步問題:線程使用公共變量/內(nèi)存時(shí)需要使用同步機(jī)制還是因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。
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);
}
答: 10 4 9
網(wǎng)絡(luò)/網(wǎng)絡(luò)編程部份:
1、connect方法會阻塞,請問有什么方法可以避免其長時(shí)間阻塞?
答:最通常的方法最有效的是加定時(shí)器;也可以采用非阻塞模式。
2、網(wǎng)絡(luò)中,如果客戶端突然掉線或者重啟,服務(wù)器端怎么樣才能立刻知道?
答:若客戶端掉線或者重新啟動(dòng),服務(wù)器端會收到復(fù)位信號,每一種tcp/ip得實(shí)現(xiàn)不一樣,控制機(jī)制也不一樣。
3.在子網(wǎng)210.27.48.21/30種有多少個(gè)可用地址?分別是什么?
答:
簡:
30表示的是網(wǎng)絡(luò)號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。
詳:
210.27.48.21/30 代表的子網(wǎng)的網(wǎng)絡(luò)號是30位,即網(wǎng)絡(luò)號是210.27.48.21 & 255.255.255.251=210.27.48.20,此子網(wǎng)的地址空間是2位,即可以有4個(gè)地址:210.27.48.20, 210.27.48.21, 210.27.48.22, 210.27.48.23。第一個(gè)地址的主機(jī)號(host number/id)是0,而主機(jī)號0代表的是multicast地址。最后一個(gè)地址的最后兩位是11,主機(jī)號每一位都為1代表的是廣播 (broadcast)地址。所以只有中間兩個(gè)地址可以給host使用。其實(shí)那個(gè)問題本身不準(zhǔn)確,廣播或multicast地止也是可以使用的地址,所以 回答4也應(yīng)該正確,當(dāng)然問的人也可能是想要你回答2。我個(gè)人覺得最好的回答是一個(gè)廣播地址,一個(gè)multicast地址,2個(gè)unicast地址。
4.TTL是什么?有什么用處,通常那些工具會用到它?(ping? traceroute? ifconfig? netstat?)
答:
簡:TTL是Time To Live,一般是hup count,每經(jīng)過一個(gè)路由就會被減去一,如果它變成0,包會被丟掉。它的主要目的是防止包在有回路的網(wǎng)絡(luò)上死轉(zhuǎn),浪費(fèi)網(wǎng)絡(luò)資源。ping和traceroute用到它。
詳:TTL 是Time To Live,目前是hup count,當(dāng)包每經(jīng)過一個(gè)路由器它就會被減去一,如果它變成0,路由器就會把包丟掉。IP網(wǎng)絡(luò)往往帶有環(huán)(loop),比如子網(wǎng)A和子網(wǎng)B有兩個(gè)路由器 相連,它就是一個(gè)loop。TTL的主要目的是防止包在有回路的網(wǎng)絡(luò)上死轉(zhuǎn),因?yàn)榘腡TL最終后變成0而使得此包從網(wǎng)上消失(此時(shí)往往路由器會送一個(gè) ICMP包回來,traceroute就是根據(jù)這個(gè)做的)。ping會送包出去,所以里面有它,但是ping不一定非要不可它。traceroute則是 完全因?yàn)橛兴拍艹傻摹fconfig是用來配置網(wǎng)卡的,netstat -rn 是用來列路由表的,所以都用不著它
5.路由表示做什么用的?在linux環(huán)境中怎么來配置一條默認(rèn)路由?
答:
簡:路由表是用來決定如何將包從一個(gè)子網(wǎng)傳送到另一個(gè)子網(wǎng)的,換局話說就是用來決定從一個(gè)網(wǎng)卡接收到的包應(yīng)該送的哪一張網(wǎng)卡上的。在Linux上可以用“route add default gw <默認(rèn)路由器IP>”來配置一條默認(rèn)路由。
詳: 路由表是用來決定如何將包從一個(gè)子網(wǎng)傳送到另一個(gè)子網(wǎng)的,換局話說就是用來決定從一個(gè)網(wǎng)卡接收到的包應(yīng)該送的哪一張網(wǎng)卡上的。路由表的每一行至少有目標(biāo)網(wǎng) 絡(luò)號、netmask、到這個(gè)子網(wǎng)應(yīng)該使用的網(wǎng)卡。當(dāng)路由器從一個(gè)網(wǎng)卡接收到一個(gè)包時(shí),它掃描路由表的每一行,用里面的netmask和包里的目標(biāo)IP地 址做并邏輯運(yùn)算(&)找出目標(biāo)網(wǎng)絡(luò)號,如果此網(wǎng)絡(luò)號和這一行里的網(wǎng)絡(luò)號相同就將這條路由保留下來做為備用路由,如果已經(jīng)有備用路由了就在這兩條路 由里將網(wǎng)絡(luò)號最長的留下來,另一條丟掉,如此接著掃描下一行直到結(jié)束。如果掃描結(jié)束任沒有找到任何路由,就用默認(rèn)路由。確定路由后,直接將包送到對應(yīng)的網(wǎng) 卡上去。在具體的實(shí)現(xiàn)中,路由表可能包含更多的信息為選路由算法的細(xì)節(jié)所用。題外話:路由算法其實(shí)效率很差,而且不scalable,解決辦法是使用IP 交換機(jī),比如MPLS。
在Linux上可以用“route add default gw <默認(rèn)路由器IP>”來配置一條默認(rèn)路由。
6.在網(wǎng)絡(luò)中有兩臺主機(jī)A和B,并通過路由器和其他交換設(shè)備連接起來,已經(jīng)確認(rèn)物理連接正確無誤,怎么來測試這兩臺機(jī)器是否連通?如果不通,怎么來判斷故障點(diǎn)?怎么排除故障?
答:測試這兩臺機(jī)器是否連通:從一臺機(jī)器ping另一臺機(jī)器
如果ping不通,用traceroute可以確定是哪個(gè)路由器不能連通,然后再找問題是在交換設(shè)備/hup/cable等。
7.網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器,使用多進(jìn)程 與 多線程 ,請問有什么區(qū)別?
答案一:
1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。
2,線程:相對與進(jìn)程而言,線程是一個(gè)更加接近與執(zhí)行體的概念,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。
兩者都可以提高程序的并發(fā)度,提高程序運(yùn)行效率和響應(yīng)時(shí)間。
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。
答案二:
根本區(qū)別就一點(diǎn):用多進(jìn)程每個(gè)進(jìn)程有自己的地址空間(address space),線程則共享地址空間。所有其它區(qū)別都是由此而來的:
1。速度:線程產(chǎn)生的速度快,線程間的通訊快、切換快等,因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。
2。資源利用率:線程的資源利用率比較好也是因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。
3。同步問題:線程使用公共變量/內(nèi)存時(shí)需要使用同步機(jī)制還是因?yàn)樗麄冊谕粋€(gè)地址空間內(nèi)。
posted on 2009-12-03 15:51 石頭@ 閱讀(2395) 評論(1) 編輯 收藏 所屬分類: Tcp/Ip