這兩天在研究
Windows Socket
編程,今天總算有了一點突破,把自己做的東西發上來。
CAsyncSocket
類在非常低的級別上封裝
Windows Sockets API
。
CAsyncSocket
適合那些對網絡通信細節很了解,但希望利用回調的便利通知網絡事件的程序員使用。如果想利用
Windows Sockets
方便地處理
MFC
應用程序中的多個網絡協議,而又不想放棄靈活性,可以考慮使用
CAsyncSocket
。
??????
本文介紹如何用
CasyncSocket
類進行雙機通信應用程序的開發。后面附有源程序。
??????
要使用
CasyncSocket
進行通信,首先我們需要創建一個
SOCKET
。可以使用
CasyncSocket
的
Create()
方法。
構造一個
CAsyncSocket
對象并使用該對象創建基礎
SOCKET
句柄。
套接字的創建遵循兩階段構造的
MFC
模式。
例如:
CAsyncSocket?sock;

sock.Create(?);?
//
?Use?the?default?parameters?
-
?或?
-
?
CAsyncSocket
*
?pSocket?
=
?
new
?CAsyncSocket;

int
?nPort?
=
?
27
;

pSocket
->
?Create(?nPort,?SOCK_DGRAM?);?
上面的第一個構造函數在堆棧上創建一個
CAsyncSocket
對象,第二個構造函數在堆上創建
CAsyncSocket
。上面的第一個
Create
調用使用默認參數創建流式套接字,第二個
Create
調用創建具有指定端口和地址的數據文報套接字。(任一個
Create
版本都可以和任一種構造方法一起使用。)
Create
的參數有:
“
端口
”
:短整型。
對于服務器套接字,必須指定端口
。對于客戶端套接字,通常接受此參數的默認值,該值允許
Windows Sockets
選擇端口。
套接字類型:
SOCK_STREAM
(默認值)或
SOCK_DGRAM
。
套接字
“
地址
”
,如
“ftp.microsoft.com”
或
“128.56.22.8”
。
該地址為網絡上的網際協議
(IP)
地址。很可能要始終依賴此參數的默認值。
?????? SOCKET
創建完之后就可使使用了。如果是客戶端就可以使用
CAsyncSocket::Connect
將此套接字對象連接到服務器套接字。如果是服務器端就可以使用使用
CAsyncSocket::Listen
偵聽來自客戶端的連接嘗試。接收到連接請求時,用
CAsyncSocket::Accept
接受該請求。
注意
Accept
成員函數采用對新的空
CSocket
對象的引用作為它的參數。在調用
Accept
之前,必須構造該對象。如果此套接字對象超出范圍,則連接關閉。
銷毀
CAsyncSocket
對象。
如果在堆棧上創建了套接字對象,當包含函數超出范圍時將調用此對象的析構函數。如果使用
new
運算符在堆上創建
了套接字對象,則您必須負責使用 delete 運算符銷毀此對象。
??????
析構函數在銷毀對象之前調用對象的
Close
成員函數。
?
當連接建立的時候,就可以進行通信了。
CasycnSocket
類提供以下需要重載的成員函數。
?
連接建立之后,就可以通過
send()
和
receive()
進行數據的收發
(
當為
TCP
連接的時候
)
,通過
Sendto()
和
ReceiveFrom
()
收發數據,當為
UDP
連接的時候。
廢話少說,放上我的例程,整個程序的主要部份就是自己構造的一個新類
CmySocket()
進行通信。里面傳遞了當前聊天窗體的句柄句柄,以便使用回調函數調用窗體類進行事件響應。
??????
程序不是很大,有興趣的朋友可以和我聯系。
源程序下載?
最后附上通訊的流程。
服務器
|
客戶端
|
// construct a socket
CSocket sockSrvr;
|
// construct a socket
CSocket sockClient;
|
// create the SOCKET
sockSrvr.Create(nPort); 1,2
|
// create the SOCKET
sockClient.Create( ); 2
|
// start listening
sockSrvr.Listen( );
|
?
|
?
|
// seek a connection
sockClient.Connect(strAddr, nPort); 3,4
|
// construct a new, empty socket
CSocket sockRecv;
// accept connection
sockSrvr.Accept( sockRecv ); 5
|
?
|
// construct file object
CSocketFile file(&sockRecv);
|
// construct file object
CSocketFile file(&sockClient);
|
// construct an archive
CArchive arIn(&file, CArchive::load);
-
或 -
CArchive arOut(&file, CArchive::store);
-
或兩者 -
|
// construct an archive
CArchive arIn(&file, CArchive::load);
-
或 -
CArchive arOut(&file, CArchive::store);
-
或兩者 -
|
// use the archive to pass data:
arIn >>dwValue;
-
或 -
arOut < < dwValue; 6
|
// use the archive to pass data:
arIn >>dwValue;
-
或 -
arOut < < dwValue; 6
|
1. 這里的 nPort 是端口號。有關端口的詳細信息,請參見 Windows Sockets:端口和套接字地址。
2. 服務器必須始終指定一個端口,以便客戶端可以連接。 Create 調用有時也指定地址。在客戶端使用默認參數,這些參數要求 MFC 使用任何可用端口。
3. 這里的 nPort 是端口號, strAddr 是計算機地址或網際協議 (IP) 地址。
4. 計算機地址可以采用幾種形式:“ftp.microsoft.com”、“microsoft.com”。IP 地址采用“以點分隔的數字”形式,如“127.54.67.32”。 Connect 函數查看地址是否為以點分隔的數字(但它不確保該數字是網絡上的有效計算機)。如果不是,則 Connect 使用其他某種形式的計算機名稱。
5. 當在服務器端調用 Accept 時,傳遞對新套接字對象的引用。必須首先構造該對象,但不對它調用 Create 。注意,如果此套接字對象超出范圍,則連接關閉。MFC 將新對象連接到 SOCKET 句柄。可以在堆棧上構造此套接字(如表中所示)或在堆上構造。
6. 存檔和套接字文件在超出范圍時將被關閉。套接字對象超出范圍或被刪除時,對象的析構函數也對此套接字對象調用 Close 成員函數。有關順序的其他說明