當前位置:編程學習大全網 - 編程語言 - 開發網絡程序,是使用Winsock API 還是使用MFC提供的Socket類

開發網絡程序,是使用Winsock API 還是使用MFC提供的Socket類

VC兩種socket類比較

壹、實現方法

微軟的MFC把復雜的WinSock API函數封裝到類裏,這使得編寫網絡應用程序更容易。CAsyncSocket類逐個封裝了WinSock API,為高級網絡程序員提供了更加有力而靈活的方法。這個類基於程序員了解網絡通訊的假設,目的是為了在MFC中使用WinSock,程序員有責任處理諸如阻塞、字節順序和在Unicode與MBCS 間轉換字符的任務。為了給程序員提供更方便的接口以自動處理這些任務,MFC給出了CSocket類,這個類是由CAsyncSocket類繼承下來的,它提供了比CAsyncSocket更高層的WinSock API接口。Csocket類和CsocketFile類可以與Carchive類壹起合作來管理發送和接收的數據,這使管理數據收發更加便利。CSocket對象提供阻塞模式,這對於Carchive的同步操作是至關重要的。阻塞函數(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完成後才返回控制權,因此如果需要低層控制和高效率,就使用CasyncSock類;如果需要方便,則可使用Csocket類。

CSocket類是由CAsyncSocket繼承而來的,事實上,在MFC中CAsyncSocket 逐個封裝了WinSock API,每個CAsyncSocket對象代表壹個Windows Socket對象,使用CAsyncSocket 類要求程序員對網絡編程較為熟悉。相比起來,CSocket類是CAsyncSocket的派生類,繼承了它封裝的WinSock API。

壹個CSocket對象代表了壹個比CAsyncSocket對象更高層次的Windows Socket的抽象,CSocket類與CSocketFile類和CArchive類壹起工作來發送和接收數據,因此使用它更加容易使用。CSocket對象提供阻塞模式,因為阻塞功能對於CArchive的同步操作是至關重要的。在這裏有必要對阻塞的概念作壹解釋:壹個socket可以處於"阻塞模式"或"非阻塞模式",當壹個套接字處於阻塞模式(即同步操作)時,它的阻塞函數直到操作完成才會返回控制權,之所以稱為阻塞是因為此套接字的阻塞函數在完成操作返回之前什麽也不能做。如果壹個socket處於非阻塞模式(即異步操作),則會被調用函數立即返回。在CAsyncSocket類中可以用GetLastError 成員函數查詢最後的錯誤,如果錯誤是WSAEWOULDBLOCK則說明有阻塞,而CSocket絕不會返回WSAEWOULDBLOCK,因為它自己管理阻塞。微軟建議盡量使用非阻塞模式,通過網絡事件的發生而通知應用程序進行相應的處理。但在CSocket類中,為了利用CArchive 處理通訊中的許多問題和簡化編程,它的壹些成員函數總是具有阻塞性質的,這是因為CArchive類需要同步的操作。

在Win32環境下,如果要使用具有阻塞性質的套接字,應該放在獨立的工作線程中處理,利用多線程的方法使阻塞不至於幹擾其他線程,也不會把CPU時間浪費在阻塞上。多線程的方法既可以使程序員享受CSocket帶來的簡化編程的便利,也不會影響用戶界面對用戶的反應。

CAsyncSocket類編程模型

在壹個MFC應用程序中,要想輕松處理多個網絡協議,而又不犧牲靈活性時,可以考慮使用CAsyncSocket類,它的效率比CSocket 類要高。CAsyncSocket類針對字節流型套接字的編程模型簡述如下:

1、構造壹個CAsyncSocket對象,並用這個對象的Create成員函數產生壹個Socket句柄。可以按如下兩種方法構造:

CAsyncSocket sock; //使用默認參數產生壹個字節流套接字

Sock.Create();

或在指定端口號產生壹個數據報套接字

CAsyncSocket*pSocket=newCAsyncSocket;

int nPort=27;

pSocket->Create(nPort,SOCK-DGRAM);

第壹種方法在棧上產生壹個CAsyncSocket對象,而第二種方法在堆上產生CAsyncSocket對象;第壹種方法中Create()成員函數用缺省參數產生壹個字節流套接字,第二種方法中用Create()成員函數在指定的端口產生壹個數字報套接字。Create()函數的原型為:

BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,

LPCTSTR lpszSocketA

  • 上一篇:PLC如何學習?
  • 下一篇:微信小程序開發貴不貴,費用多少
  • copyright 2024編程學習大全網