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 |
Dabei ist nPort eine Portnummer. Weitere Informationen zu Ports finden Sie unter Windows Sockets: Ports und Socketadressen .
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.Dabei ist nPort eine Portnummer und strAddr eine Computeradresse oder eine IP-Adresse (Internet Protocol).
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.Wenn Sie auf der Serverseite aufrufen
Accept
, übergeben Sie einen Verweis auf ein neues Socketobjekt. Sie müssen dieses Objekt zuerst erstellen, aber nicht aufrufenCreate
. 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.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 Connect
können). Wenn Sie stattdessen Klassen CAsyncSocket
verwenden, 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. CFile
Elemente 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::SerializeRaw
verknüpft ist; verwenden Sie CEditView::Serialize
stattdessen (nicht dokumentiert). Die SerializeRaw-Funktion erwartet, dass das Dateiobjekt Funktionen Seek
wie z CSocketFile
. B. nicht unterstützt.
Weitere Informationen finden Sie unter:
Siehe auch
Windows-Sockets in MFC
CSocket-Klasse
CAsyncSocket::Create
CAsyncSocket::Close