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版權聲明:本文為部落客原創文章,轉載請附上博文連結!