當前位置:編程學習大全網 - 編程語言 - CAsyncSocket網絡編程

CAsyncSocket網絡編程

VC中兩個套接字類的比較

壹、實現方法

Microsoft 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。其實CAsyncSocket在MFC中是把WinSock API壹個壹個封裝起來的,每個CAsyncSocket對象代表壹個Windows Socket對象。使用CAsyncSocket類需要程序員熟悉網絡編程。相比之下,CSocket類是CAsyncSocket的派生類,繼承了它封裝的WinSock API。

CSocket對象表示比CAsyncSocket對象更高級別的Windows套接字抽象。CSocket類與CSocketFile類和CArchive類壹起發送和接收數據,因此更容易使用。CSocket對象提供了阻塞模式,因為阻塞功能對於CArchive的同步操作非常重要。這裏有必要解釋壹下阻塞的概念:壹個套接字可以處於“阻塞模式”或者“非阻塞模式”。當套接字處於阻塞模式(即同步操作)時,其阻塞函數不會返回控制,直到操作完成。之所以稱之為阻塞,是因為這個套接字的阻塞函數在操作返回之前不能做任何事情。如果套接字處於非阻塞模式(即異步操作),被調用的函數將立即返回。在CAsyncSocket類中,可以使用GetLastError成員函數查詢最後壹個錯誤。如果錯誤為WSAEWOULDBLOCK,則說明有塊,CSocket永遠不會返回WSAEWOULDBLOCK,因為它自己管理塊。微軟建議盡量使用非阻塞模式,通過網絡事件的發生通知應用程序進行相應處理。但是在CSocket類中,為了用CArchive處理通信中的很多問題,簡化編程,它的壹些成員函數總是阻塞的,因為CArchive類需要同步操作。

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

CAsyncSocket類編程模型

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

1.構造壹個CAsyncSocket對象,用這個對象的Create member函數生成壹個套接字句柄。它可以通過以下兩種方式構建:

CAsyncSocket襪子;//用默認參數生成字節流套接字。

襪子。create();

或者在指定的端口號上生成數據報套接字。

CAsyncSocket * p socket = newCAsyncSocket;

int nPort = 27

p socket-& gt;Create(nPort,SOCK-DGRAM);

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

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

LPCTSTR lpszSocketA

  • 上一篇:競品分析:騰訊課堂VS網易雲課堂
  • 下一篇:無人機影像處理電腦配置要求高嗎
  • copyright 2024編程學習大全網