QT分析之網路編程(一)
2010-07-01 23:19:52| 分類:
QT分析之網路編程 | 標籤:
|字型大小大中小 訂閱
QT分析之網路編程(一)
程式人生 2010-01-28 16:25:53 閱讀299 評論0 字型大小:大中小
首先對Windows下的網路編程總結一下:
如果是伺服器,其WinSDK調用分別為:
WSAStartup() -> socket() -> htons() / htonl() -> bind() -> listen() -> accept() -> recv() / send() -> closesocket() -> WSACleanup()
如果是用戶端程式,其調用序列為:
WSAStartup() -> socket() -> htons() / htonl() -> connect() -> recv() / send() -> closesocket() -> WSACleanup()
前面轉貼的用戶端(WinSocket溫習)程式中,收到資訊就在console列印出來然後退出了;在一般的應用中,通常是要一直等待收發訊息的,直到程式確認退出才關閉socket。如果用一個輪詢就會佔用很多的CPU資源,所以很多嵌入式設計中會用一個WaitForMultiObject調用,等待退出命令或者逾時,然後退出或進行下一輪資訊接受。在Windows平台下也有一些比較高明的設計,使用非同步socket,然後用非同步選擇的辦法,實現多線程和事件的並發。在WinSocket中,同樣也有一套非同步Socket函數,那就是使用WSAAsyncSelect()及其配合函數。具體可以參考MSDN。QT在Windows平台上的實現,肯定也跟這些SDK調用有關。
按照這個思路,果然在QT代碼裡面找到了Qnativesocketengine_win.cpp,WSAStartup(),WSASocket()等序列WSA函數都有。QNativeSocketEnginePrivate類把這些SDK封裝成:createNewSocket()、option()、setOption()、nativeConnect()、nativeBind()、nativeListen()、nativeAccept()、nativeWrite()、nativeRead()、nativeSelect()、nativeClose()等。按照QT的設計,QPrivate類是資料類;Q類應該是主類。接著看QNativeSocket類的繼承:
QNativeSocketEngine : public QAbstractSocketEngine : public QObject
QAbstractSocketEngine類是使用了大量純虛函數的定義。繼續深入查看,發現大量有關的類:QAbstractSocket,SocketAsyncHandler,QTcpSocket,QUdpSocket等,看來我要先瞭解下QT網路編程體系再進一步分析之。