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 |
Où nPort est un numéro de port. Consultez Les sockets Windows : ports et adresses de socket pour plus d’informations sur les ports.
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.Où nPort est un numéro de port et strAddr est une adresse de machine ou une adresse IP (Internet Protocol).
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.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’appelezCreate
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.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 ; CFile
CFile
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::SerializeRaw
de ; 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