Windows Sockets: Reihenfolge der Operationen

In diesem Artikel wird die Abfolge von Vorgängen für einen Serversocket und ein Clientsocket nebeneinander veranschaulicht. Da die Sockets Objekte verwenden CArchive , sind sie unbedingt Streamsockets.

Sequenz von Vorgängen für eine Datenstromsocketkommunikation

Bis zum Punkt der Erstellung eines CSocketFile Objekts ist die folgende Sequenz (mit einigen Parameterunterschieden) für beide CAsyncSocket und CSocket. Ab diesem Zeitpunkt ist die Sequenz streng für CSocket. In der folgenden Tabelle wird die Abfolge der Vorgänge zum Einrichten der Kommunikation zwischen einem Client und einem Server veranschaulicht.

Einrichten der Kommunikation zwischen einem Server und einem 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);

Oder

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

- oder beides -
// construct an archive

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

Oder

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

- oder beides -
// use the archive to pass data:

arIn >> dwValue;

Oder

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

arIn >> dwValue;

Oder

arOut << dwValue;6
  1. Dabei ist nPort eine Portnummer. Weitere Informationen zu Ports finden Sie unter Windows Sockets: Ports und Socketadressen .

  2. Der Server muss immer einen Port angeben, damit Clients eine Verbindung herstellen können. Der Create Anruf gibt manchmal auch eine Adresse an. Verwenden Sie auf clientseitiger Seite die Standardparameter, die MFC auffordern, einen beliebigen verfügbaren Port zu verwenden.

  3. Dabei ist nPort eine Portnummer und strAddr eine Computeradresse oder eine IP-Adresse (Internet Protocol).

  4. Computeradressen können mehrere Formen annehmen: "ftp.microsoft.com", "microsoft.com". IP-Adressen verwenden das Formular "gepunktete Zahl" "127.54.67.32". Die Connect Funktion überprüft, ob es sich bei der Adresse um eine gepunktete Zahl handelt (obwohl nicht überprüft wird, ob es sich bei der Nummer um einen gültigen Computer im Netzwerk handelt). Wenn nicht, Connect wird ein Computername eines der anderen Formulare vorausgesetzt.

  5. Wenn Sie auf der Serverseite aufrufen Accept , übergeben Sie einen Verweis auf ein neues Socketobjekt. Sie müssen dieses Objekt zuerst erstellen, aber nicht aufrufen Create . Denken Sie daran, dass die Verbindung geschlossen wird, wenn dieses Socketobjekt den Gültigkeitsbereich überschreitet. MFC verbindet das neue Objekt mit einem SOCKET-Handle . Sie können den Socket auf dem Stapel erstellen, wie dargestellt oder auf dem Heap.

  6. Das Archiv und die Socketdatei werden geschlossen, wenn sie außerhalb des Gültigkeitsbereichs liegen. Der Destruktor des Socketobjekts ruft auch die Close-Memberfunktion für das Socketobjekt auf, wenn das Objekt außerhalb des Gültigkeitsbereichs liegt oder gelöscht wird.

Weitere Hinweise zur Sequenz

Die Sequenz von Aufrufen, die in der vorherigen Tabelle angezeigt werden, ist für einen Datenstromsocket vorgesehen. Datagram sockets, die ohne Verbindung sind, erfordern nicht das CAsyncSocket::Verbinden, Listen und Annehmen von Anrufen (obwohl Sie optional verwenden Connectkönnen). Wenn Sie stattdessen Klassen CAsyncSocketverwenden, verwenden Datagrammsockets die CAsyncSocket::SendTo Funktionen und ReceiveFrom Memberfunktionen. (Wenn Sie mit einem Datagrammsocket arbeiten Connect , verwenden Send Sie und Receive.) Da CArchive es sich nicht um Datagramme handelt, verwenden CSocket Sie sie nicht mit einem Archiv, wenn es sich bei dem Socket um ein Datagramm handelt.

CSocketFile unterstützt nicht alle Funktionen. CFileElemente wie zSeek. CFile B. , die für eine Socketkommunikation keinen Sinn machen, sind nicht verfügbar. Aus diesem Fall sind einige MFC-Standardfunktionen Serialize nicht kompatibel mit CSocketFile. Dies gilt besonders für die CEditView Klasse. Sie sollten nicht versuchen, Daten über ein Objekt zu serialisieren CEditView , das mit einem CArchive CSocketFile Objekt CEditView::SerializeRawverknüpft ist; verwenden Sie CEditView::Serialize stattdessen (nicht dokumentiert). Die SerializeRaw-Funktion erwartet, dass das Dateiobjekt Funktionen Seekwie z CSocketFile . B. nicht unterstützt.

Weitere Informationen finden Sie unter:

Siehe auch

Windows-Sockets in MFC
CSocket-Klasse
CAsyncSocket::Create
CAsyncSocket::Close