Condividi tramite


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 CSocketper 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
  1. Dove nPort è un numero di porta. Per informazioni dettagliate sulle porte, vedere Windows Sockets: Ports and Socket Addresses (Windows Sockets: porte e indirizzi socket).

  2. 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.

  3. Dove nPort è un numero di porta e strAddr è un indirizzo computer o un indirizzo IP (Internet Protocol).

  4. 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.

  5. Quando si chiama Accept sul lato server, si passa un riferimento a un nuovo oggetto socket. È prima necessario costruire questo oggetto, ma non chiamarlo Create . 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.

  6. 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 CFilefunzionalità 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