Windows Sockets: sequenza di operazioni
Questo articolo illustra, side-by-side, la sequenza di operazioni per un socket server e un socket client. Poiché i socket usano CArchive
oggetti, sono necessariamente socket di flusso.
Sequenza di operazioni per una comunicazione socket di flusso
Fino al punto di costruire un CSocketFile
oggetto, la sequenza seguente è accurata (con alcune differenze di parametri) sia per che CSocket
per CAsyncSocket
. Da quel punto in poi, la sequenza è rigorosamente per CSocket
. Nella tabella seguente viene illustrata la sequenza di operazioni per la configurazione della comunicazione tra un client e un server.
Configurazione della comunicazione tra un server e un client
Server | 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); -oppure- CArchive arOut(&file, CArchive::store); - o entrambi - |
// construct an archive CArchive arIn(&file, CArchive::load); -oppure- CArchive arOut(&file, CArchive::store); - o entrambi - |
// use the archive to pass data: arIn >> dwValue; -oppure- arOut << dwValue; 6 |
// use the archive to pass data: arIn >> dwValue; -oppure- arOut << dwValue; 6 |
Dove nPort è un numero di porta. Per informazioni dettagliate sulle porte, vedere Windows Sockets: Ports and Socket Addresses (Windows Sockets: porte e indirizzi socket).
Il server deve sempre specificare una porta in modo che i client possano connettersi. La
Create
chiamata a volte specifica anche un indirizzo. Sul lato client usare i parametri predefiniti, che chiedono a MFC di usare qualsiasi porta disponibile.Dove nPort è un numero di porta e strAddr è un indirizzo computer o un indirizzo IP (Internet Protocol).
Gli indirizzi del computer possono assumere diverse forme: "ftp.microsoft.com", "microsoft.com". Gli indirizzi IP usano il formato "numero punteggiato" "127.54.67.32". La
Connect
funzione controlla se l'indirizzo è un numero punteggiato (anche se non verifica che il numero sia un computer valido nella rete). In caso contrario,Connect
si presuppone un nome di computer di uno degli altri moduli.Quando si chiama
Accept
sul lato server, si passa un riferimento a un nuovo oggetto socket. È prima necessario costruire questo oggetto, ma non chiamarloCreate
. Tenere presente che se questo oggetto socket esce dall'ambito, la connessione si chiude. MFC connette il nuovo oggetto a un handle SOCKET . È possibile costruire il socket nello stack, come illustrato o nell'heap.L'archivio e il file socket vengono chiusi quando escono dall'ambito. Il distruttore dell'oggetto socket chiama anche la funzione membro Close per l'oggetto socket quando l'oggetto esce dall'ambito o viene eliminato.
Note aggiuntive sulla sequenza
La sequenza di chiamate mostrate nella tabella precedente è relativa a un socket di flusso. I socket del datagramma, che sono senza connessione, non richiedono le chiamate CAsyncSocket::Connessione, Listen e Accept (anche se facoltativamente è possibile usare Connect
). Se invece si usa la classe CAsyncSocket
, i socket di datagrammi usano le CAsyncSocket::SendTo
funzioni membro e ReceiveFrom
. Se si usa con un socket di datagrammi, si usano Connect
Send
e Receive
. Poiché CArchive
non funziona con i datagrammi, non usare CSocket
con un archivio se il socket è un datagramma.
CSocketFile non supporta tutte le CFile
funzionalità di , CFile
ad esempio Seek
, che non hanno senso per una comunicazione socket, non sono disponibili. Per questo motivo, alcune funzioni MFC Serialize
predefinite non sono compatibili con CSocketFile
. Questo è particolarmente vero della CEditView
classe . Non è consigliabile provare a serializzare CEditView
i dati tramite un CArchive
oggetto associato a un CSocketFile
oggetto utilizzando CEditView::SerializeRaw
; utilizzare CEditView::Serialize
invece (non documentato). La funzione SerializeRaw prevede che l'oggetto file abbia funzioni, ad esempio Seek
, che CSocketFile
non supporta.
Per altre informazioni, vedere:
Vedi anche
Windows Sockets in MFC
Classe CSocket
CAsyncSocket::Create
CAsyncSocket::Close