Windows Sockets : Séquence d'événements
Cet article explique, côte à côte, la séquence d'événements pour un socket serveur et un socket client. Les sockets utilisent des objets CArchive, ils sont nécessairement des sockets flux.
Séquence d'événements pour une communication Stream Socket
Jusqu'à la création d'un objet CSocketFile, la suite est exacte (avec quelques différences de paramètre) pour CAsyncSocket et CSocket. À partir de ce point, la séquence est strictement pour CSocket. Le tableau suivant montre la séquence d'événements pour configurer la communication entre un client et un serveur.
Configuration des communications 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. Où nPort est un numéro de port. Voir le Protocole Windows : Ports et Adresses de Sockets 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 tout port disponible.
3. Où nPort est un numéro de port et un strAddr est une adresse d'ordinateur ou une adresse Internet Protocol (IP).
4. Les adresses d'ordinateur peut prendre plusieurs formes : « ftp.microsoft.com », « microsoft.com ». Les adresses IP utilisent la forme en nombre pointés « 127.54.67.32 ». La fonciton Connect vérifie si l'adresse est un nombre pointé (bien qu'il ne vérifie pas si le nombre est un ordinateur valide sur le réseau). Sinon, Connect suppose un nom d'ordinateur de l'une des autres formes.
5. Lorsque vous appelez Accept côté serveur, vous passez une référence à un objet socket. Vous devez créer cet objet dans un premier temps, mais n'appelez pas Create pour celui-ci. N'oubliez pas que si cet objet socket sort de l'étendue, la connexion se ferme. MFC connecte le nouvel objet à un descripteur de SOCKET. Vous pouvez construire le socket dans la pile, tel qu'indiqué, ou sur le tas.
6. L'archive et le fichier de socket sont fermés lorsqu'ils passent hors de portée. Le destructeur de l'objet socket appelle également la méthode Close de 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 flux. Les sockets datagramme, qui sont sans connexion, ne nécessitent pas CAsyncSocket::Connect, Listen, et les appels à Accept (bien que vous pouvez éventuellement utiliser Connect). En revanche, si vous utilisez la classe CAsyncSocket, les sockets datagramme utilisent les méthodes CAsyncSocket::SendTo et ReceiveFrom. (Si vous utilisez Connect avec un socket datagramme, vous utilisez Send et Receive.) Comme CArchive ne fonctionne pas avec les datagrammes, n'utilisez pas CSocket avec une archive si le socket est un datagramme.
CSocketFile ne prend pas en charge toutes les fonctionnalités de CFile; les membres de CFile comme Seek, qui n'ont pas de sens pour une communication de socket, ne sont pas disponibles. Par conséquent, certaines fonctions de MFC par défault Serialize ne sont pas compatibles avec CSocketFile. Cela est particulièrement vrai de la classe CEditView. Vous ne devez pas essayer de sérialiser des données de CEditView via un objet CArchive associé à un objet CSocketFile en utilisant CEditView::SerializeRaw; utilisez CEditView::Serialize à la place (non documenté). La fonction SerializeRaw attend que le fichier objet ait des fonctions, telles que Seek, que CSocketFile ne prend pas en charge.
Pour plus d'informations, consultez :