Partager via


Windows Sockets : ordre des opérations

Cet article illustre, côte à côte, la séquence d’opérations d’un socket serveur et d’un socket client. Étant donné que les sockets utilisent CArchive des objets, ils sont nécessairement des sockets de flux.

Séquence d’opérations pour une communication stream socket

Jusqu’au point de construire un CSocketFile objet, la séquence suivante est précise (avec quelques différences de paramètre) pour les deux CAsyncSocket et CSocket. De ce point, la séquence est strictement pour CSocket. Le tableau suivant illustre la séquence d’opérations permettant de configurer la communication entre un client et un serveur.

Configuration de la communication entre un serveur et un client

Serveur 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);

-ou-

CArchive arOut(&file, CArchive::store);

- ou les deux -
// construct an archive

CArchive arIn(&file, CArchive::load);

-ou-

CArchive arOut(&file, CArchive::store);

- ou les deux -
// use the archive to pass data:

arIn >> dwValue;

-ou-

arOut << dwValue;6
// use the archive to pass data:

arIn >> dwValue;

-ou-

arOut << dwValue;6
  1. nPort est un numéro de port. Consultez Les sockets Windows : ports et adresses de socket pour plus d’informations sur les ports.

  2. Le serveur doit toujours spécifier un port afin que les clients puissent se connecter. L’appel Create spécifie parfois également une adresse. Côté client, utilisez les paramètres par défaut, qui demandent à MFC d’utiliser n’importe quel port disponible.

  3. nPort est un numéro de port et strAddr est une adresse de machine ou une adresse IP (Internet Protocol).

  4. Les adresses de machine peuvent prendre plusieurs formes : « ftp.microsoft.com », « microsoft.com ». Les adresses IP utilisent le formulaire « nombre en pointillé » « 127.54.67.32 ». La Connect fonction case activée pour voir si l’adresse est un nombre en pointillés (bien qu’elle ne case activée pas pour vous assurer que le nombre est un ordinateur valide sur le réseau). Si ce n’est pas le cas, Connect suppose un nom d’ordinateur de l’une des autres formes.

  5. Lorsque vous appelez Accept côté serveur, vous transmettez une référence à un nouvel objet socket. Vous devez d’abord construire cet objet, mais ne l’appelez Create pas. N’oubliez pas que si cet objet socket sort de l’étendue, la connexion se ferme. MFC connecte le nouvel objet à un handle SOCKET . Vous pouvez construire le socket sur la pile, comme indiqué ou sur le tas.

  6. L’archive et le fichier de socket sont fermés lorsqu’ils sortent de l’étendue. Le destructeur de l’objet socket appelle également la fonction Close membre pour l’objet socket lorsque l’objet sort de l’étendue ou est supprimé.

Remarques supplémentaires sur la séquence

La séquence d’appels indiqués dans le tableau précédent concerne un socket de flux. Les sockets datagram, qui sont sans connexion, ne nécessitent pas les appels CAsyncSocket ::Connecter, Listen et Accept (bien que vous puissiez éventuellement utiliserConnect). Au lieu de cela, si vous utilisez la classeCAsyncSocket, les sockets de datagramme utilisent les fonctions membres et ReceiveFrom les CAsyncSocket::SendTo fonctions membres. (Si vous utilisez Connect un socket de datagramme, vous utilisez Send et Receive.) Étant donné que CArchive ne fonctionne pas avec les datagrammes, n’utilisez CSocket pas avec une archive si le socket est un datagramme.

CSocketFile ne prend pas en charge toutes les fonctionnalités ; CFileCFile les membres tels que Seek, qui n’ont aucun sens pour une communication de socket, ne sont pas disponibles. En raison de cela, certaines fonctions MFC Serialize par défaut ne sont pas compatibles avec CSocketFile. C’est particulièrement vrai de la CEditView classe. Vous ne devez pas essayer de sérialiser des CEditView données via un CArchive objet attaché à un CSocketFile objet à l’aide CEditView::SerializeRawde ; utilisez CEditView::Serialize à la place (pas documenté). La fonction SerializeRaw s’attend à ce que l’objet de fichier ait des fonctions, telles que Seek, qui CSocketFile ne prennent pas en charge.

Pour en savoir plus, consultez :

Voir aussi

Windows Sockets dans MFC
CSocket, classe
CAsyncSocket ::Create
CAsyncSocket ::Close