天天看點

360、騰訊、迅雷Windows程式設計、網絡程式設計面試題及答案

1. 問MainFrm,CDocument和CView類之間的關系,

MainFrm為架構類,包含應用程式外框所包含部分。CView為視圖類,用于顯示資料的空白區域視窗。

CDocument為文檔類。

MFC提供了文檔/視類結構,采用資料本身和顯示分離的機制。其中文檔類CDocument用于資料的存儲和加載,視類CView用于資料的顯示與修改。

2. Dialog和 ModuelDialog不同用法

1)類型不同

MoudleDialog 模态對話框,屬于壟斷對話框,例如打開對話框,點選打開後不能再執行其他操作,會發出“嘟嘟嘟”的聲音;

非模态對話框,屬于非壟斷對話框,利用查找對話框,點選查找同時可以執行其他操作;

即:非模态不壟斷;模态壟斷。

2)用法不同

CDialog::Create :to create a modelessdialog box

CDialog::DoModal :Call this member function to invoke the modal dialog box andreturn the dialog-box result when done

3. 網絡程式設計的一般步驟

對于TCP連接配接:

1.伺服器端1)建立套接字create;2)綁定端口号bind;3)監聽連接配接listen;4)接受連接配接請求accept,并傳回新的套接字;5)用新傳回的套接字recv/send;6)關閉套接字。

2.用戶端1)建立套接字create; 2)發起建立連接配接請求connect; 3)發送/接收資料send/recv;4)關閉套接字。

TCP總結:

Server端:create -- bind -- listen--  accept--  recv/send-- close

Client端:create------- conncet------send/recv------close.

對于UDP連接配接:

1.伺服器端:1)建立套接字create;2)綁定端口号bind;3)接收/發送消息recvfrom/sendto;4)關閉套接字。

2.用戶端:1)建立套接字create;2)發送/接收消息sendto/recvfrom;3)關閉套接字.

UDP總結:

Server端:create----bind ----recvfrom/sendto----close

Client端:create----  sendto/recvfrom----close.

4.sendMessage與postMessage差別?

不同點:sendMessage發送完畢以後需要等待處理完才傳回;而postMessage發送消息後立即傳回。

Do not post the WM_QUIT message using PostMessage; use thePostQuitMessage function.

postMessage将消息放置到消息隊列中,不等待線程處理消息就立即傳回。

sendMessage發送指定的消息到視窗,并會調用視窗過程,直到視窗過程處理完畢後才傳回。

5. TCP的重發機制是怎麼實作的?

1.滑動視窗機制,确立收發的邊界,能讓發送方知道已經發送了多少(已确認)、尚未确認的位元組數、尚待發送的位元組數;讓接收方知道(已經确認收到的位元組數)。

2.選擇重傳,用于對傳輸出錯的序列進行重傳。

6. TCP和UDP的差別?

1)TCP面向連接配接(三次握手機制),通信前需要先建立連接配接;UDP面向無連接配接,通信前不需要建立連接配接;

2)TCP保障可靠傳輸(按序、無差錯、不丢失、不重複);UDP不保障可靠傳輸,使用最大努力傳遞;

3)TCP面向位元組流的傳輸,UDP面向資料報的傳輸。

7.程序間通信有哪些方式?

1)共享記憶體,如剪貼闆;

2)匿名管道/命名管道;

3)郵槽。

其中共享記憶體、匿名管道隻能實作兩個程序間的通信,不能跨網絡通信;命名管道和郵槽可以跨網絡程序間通信;但命名管道屬于點對點的通信,可傳輸大資料量;而郵槽一次傳輸的資料量非常有限,通常少于424位元組。

8.TCP為什麼不是兩次連接配接?而是三次握手?

如果A與B兩個程序通信,如果僅是兩次連接配接。可能出現的一種情況就是:A發送完請封包以後,由于網絡情況不好,出現了網絡擁塞,即B延時很長時間後收到封包,即此時A将此封包認定為失效的封包。B收到封包後,會向A發起連接配接。此時兩次握手完畢,B會認為已經建立了連接配接可以通信,B會一直等到A發送的連接配接請求,而A對失效的封包回複自然不會處理。依次會陷入B忙等的僵局,造成資源的浪費。

9. connect方法會阻塞,請問有什麼方法可以避免其長時間阻塞?

可以考慮采用異步傳輸機制,同步傳輸與異步傳輸的主要差別在于同步傳輸中,如果調用recvfrom後會一緻阻塞運作,進而導緻調用線程暫停運作;異步傳輸機制則不然,會立即傳回。

10.網絡程式設計中設計并發伺服器,使用多程序與多線程,請問有什麼差別?

答案一:

1,程序:子程序是父程序的複制品。子程序獲得父程序資料空間、堆和棧的複制品。

2,線程:相對與程序而言,線程是一個更加接近與執行體的概念,它可以與同程序的其他線程共享資料,但擁有自己的棧空間,擁有獨立的執行序列。兩者都可以提高程式的并發度,提高程式運作效率和響應時間。

線程和程序在使用上各有優缺點:線程執行開銷小,但不利于資源管理和保護;而程序正相反。同時,線程适合于在SMP機器上運作,而程序則可以跨機器遷移。

答案二:

根本差別就一點:用多程序每個程序有自己的位址空間(address space),線程則共享位址空間。所有其它差別都是由此而來的:

1。速度:線程産生的速度快,線程間的通訊快、切換快等,因為他們在同一個位址空間内。

2。資源使用率:線程的資源使用率比較好也是因為他們在同一個位址空間内。

3。同步問題:線程使用公共變量/記憶體時需要使用同步機制還是因為他們在同一個位址空間内。

等等

11.簡述Windows程式設計容易出錯的幾點

12.Windows程式設計的知識點,如消息機制,一個自定義消息如何實作。

自定義消息共分為3步驟:

1)  自定義消息:#defineWM_MYMSG WM_USER+1

2)  在頭檔案中聲明函數:       afx_msg voidonMyMsg();

3) 在消息映射中添加對應關系:

//BEGIN_MESSAGE_MAP(CDefMsgDemoDlg,CDialog) //END_MESSAGE_MAP()

ON_MESSAGE(WM_MYMSG,onMyMsg)

4)定義函數void onMyMsg();

核心即:函數原型、關聯消息與消息響應函數的宏、函數實作。

13.SNMP協定

簡單網絡管理協定——應用層協定.

包括5種資料包:Get-Request;Get-Next-Request; Set-Request, Get-Response; Trap;

14.RAW套接字

廣泛應用于進階網絡程式設計,如SNIFFER、拒絕服務、IP欺騙都是通過原始套接字實作的。

15. 視窗建立的步驟:

1)設計視窗類(填充結構體)

2)注冊視窗類RegisterClassà

3)建立視窗;

4)顯示ShowWindow&更新視窗UpdateWindow

5)循環擷取消息GetMessage(){翻譯(轉換)TranslateMessage消息、處理消息DispathMessage(将消息傳遞給視窗過程進行處理)}。

16. 當觸發按鈕以後發生了什麼?

1)比如點選滑鼠左鍵後,作業系統首先會感覺到該事件;

2)作業系統将事件其轉化為消息;

3)作業系統将消息投遞到對應程式(線程)的消息隊列中;

4)應用程式(線程)從消息隊列中通過GetMessage擷取消息,并通過DispathMessge将消息傳遞給作業系統;

5)作業系統通過設計視窗類時指定的視窗過程對對消息進行處理。

17. 你平時是如何調試程式的?(引申)當一個程式在自己機器上運作正常,但是在其他機器上程式運作崩潰,如何查找原因?

斷點調試:

值:檢視變量(Variables)、表達式、記憶體(Memory)、寄存器(Register)的值。

程序控制:VC允許被中斷的程式繼續運作、單步運作和運作到指定光标處,分别對應快捷鍵F5、F10/F11和CTRL+F10。

其他調試手段:系統提供一系列特殊的函數或者宏來處理Debug版本相關的資訊TRACE、ASSERT、VERIFy。Ctrl+B打開斷點設定。

運作崩潰,如何查找原因? [提示後],可以通過列印語句來發現錯誤!

18. 線程、視窗、消息隊列三者之間的關系?

MSDN上如是說:

Thethread to which the message is posted must have created a message queue,or elsethe call to PostThreadMessage fails.  

并提供了如下兩種解決方法:

CallPostThreadMessage.If it fails, call the Sleep function and call PostThreadMessageagain. Repeat  until  PostThreadMessage  succeeds. 

【面試官】說:一個線程對應一個或多個視窗(建立的關系),同時一個線程對應了一個消息隊列。

【總結如下】:

1.在MFC程式架構裡面,CWinThread專門負責線程建立的,它可以建立使用者界面線程,及工作者線程。其中使用者界面線程是包含消息隊列的,而工作者線程是不包含消息隊列的。即【一句話】:使用者界面線程對應一個消息隊列。

2.CWinThread類和CWnd類都派生自CCmdTarget,而CDialog對話框類、視圖類CView都派生自CWnd。

【深入淺出MFC裡一句話】:不是每一個視窗都産生一個線程(因為要付出昂貴的線程切換代價)。即,深入了解之:一個線程可以對應多個視窗。主線程可以建立出其所要的全部視窗。

【結論】一個UI線程就1組消息隊列集合,一個線程可以建立多個視窗。

大家一起探讨下,對不對?歡迎讨論。。。

作者:銘毅天下

來源:CSDN

原文:

https://blog.csdn.net/laoyang360/article/details/7956611

版權聲明:本文為部落客原創文章,轉載請附上博文連結!

繼續閱讀