天天看點

QT分析之網絡程式設計(一)

首先對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網絡程式設計體系再進一步分析之。