Windows Sockets:作業順序
本文說明伺服器通訊端和用戶端通訊端的作業順序並存。 因為通訊端使用 CArchive
物件,所以它們一 定是串流通訊端 。
串流通訊端通訊的作業順序
在建構 CSocketFile
物件時,下列序列對 和 CSocket
都有一些參數差異 CAsyncSocket
是正確的。 從那一點開始,序列會嚴格為 CSocket
。 下表說明設定用戶端與伺服器之間通訊的作業順序。
設定伺服器與用戶端之間的通訊
伺服器 | Client |
---|---|
// 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 |
其中 nPort 是埠號碼。 如需埠的詳細資訊,請參閱 Windows 通訊端:埠和通訊端位址 。
伺服器必須一律指定埠,用戶端才能連線。 呼叫
Create
有時也會指定位址。 在用戶端上,使用預設參數,要求 MFC 使用任何可用的埠。其中 nPort 是埠號碼, strAddr 是電腦位址或網際網路通訊協定 (IP) 位址。
電腦位址可以採用數種形式:「ftp.microsoft.com」、「microsoft.com」。 IP 位址使用 「dotted number」 格式 「127.54.67.32」。 函
Connect
式會檢查位址是否為點數(雖然不會檢查數位以確保數位是網路上的有效電腦)。 如果沒有,Connect
則假設電腦名稱稱為其中一種其他表單。當您在伺服器端呼叫
Accept
時,會將參考傳遞至新的通訊端物件。 您必須先建構這個物件,但不要為其呼叫Create
。 請記住,如果這個通訊端物件超出範圍,連線就會關閉。 MFC 會將新的 物件連接到 SOCKET 控制碼。 您可以在堆疊上建構通訊端,如所示,或在堆積上建構通訊端。封存和通訊端檔案在超出範圍時會關閉。 當物件超出範圍或刪除時,通訊端物件的解構函式也會呼叫 socket 物件的 Close 成員函式。
序列的其他注意事項
上表所示的呼叫順序適用于資料流程通訊端。 沒有連線的 Datagram 通訊端不需要 CAsyncSocket::連線 、 接聽 和 接受 呼叫(雖然您可以選擇使用 Connect
)。 相反地,如果您使用 類別 CAsyncSocket
,資料包通訊端會使用 CAsyncSocket::SendTo
和 ReceiveFrom
成員函式。 (如果您使用 Connect
資料包通訊端,請使用 Send
和 Receive
。因為 CArchive
不適用於資料包,因此如果通訊端是資料包,請勿搭配封存使用 CSocket
。
CSocketFile 不支援所有的 CFile
功能; CFile
例如 Seek
,對於通訊端通訊而言沒有意義的成員無法使用。 因此,某些預設 MFC Serialize
函式與 不相容 CSocketFile
。 這特別適用于 CEditView
類別。 您不應該嘗試透過附加至 CSocketFile
物件的物件來序列化 CEditView
資料;請改用 CEditView::SerializeRaw
( CEditView::Serialize
未記載)。 CArchive
SerializeRaw 函式預期檔案物件具有不支援的函式,例如 Seek
CSocketFile
。
如需詳細資訊,請參閱
另請參閱
MFC 中的 Windows Sockets
CSocket 類別
CAsyncSocket::Create
CAsyncSocket::Close