Share via


Senden und Empfangen von PGM-Daten

Das Senden und Empfangen von PGM-Daten ähnelt dem Senden oder Empfangen von Daten auf einem beliebigen Socket. In den folgenden Absätzen sind spezifische Aspekte für PGM aufgeführt.

Senden von PGM-Daten

Sobald eine PGM-Sendersitzung erstellt wurde, werden Daten mit den verschiedenen Sendefunktionen von Windows Sockets gesendet: send, sendto, WSASend und WSASendTo. Da Windows Sockets Handles Dateisystemhandles sind, können auch andere Funktionen wie WriteFile und CRT-Funktionen Daten übertragen. Der folgende Codeausschnitt veranschaulicht einen PGM-Absendervorgang:

LONG        error;
    //:
error = send (s, pSendBuffer, SendLength, 0);
if (error == SOCKET_ERROR)
{
    fprintf (stderr, "send() failed: Error = %d\n",
             WSAGetLastError());
}

Bei Verwendung des Nachrichtenmodus (SOCK_RDM) führt jeder Aufruf einer Sendefunktion zu einer diskreten Nachricht, was manchmal nicht wünschenswert ist. Eine Anwendung möchte möglicherweise eine 2-Megabyte-Nachricht mit mehreren zu sendenden Aufrufen senden. Unter solchen Umständen kann der Absender die Option RM_SET_MESSAGE_BOUNDARY Socket festlegen, um die Größe der folgenden Nachricht anzugeben.

Wenn das Sendefenster voll ist, wird ein neuer Sendevorgang von der Anwendung erst akzeptiert, wenn das Fenster erweitert wurde. Der Versuch, an einem nicht blockierenden Socket zu senden, schlägt mit WSAEWOULDBLOCK fehl. Ein blockierender Socket blockiert einfach, bis das Fenster zu dem Punkt wechselt, an dem die angeforderten Daten gepuffert und gesendet werden können. Bei überlappenden E/A-Vorgängen wird der Vorgang erst abgeschlossen, wenn das Fenster ausreichend voranschreitet, um die neuen Daten aufzunehmen.

Empfangen von PGM-Daten

Sobald eine PGM-Empfängersitzung erstellt wurde, werden Daten mit den verschiedenen Empfangsfunktionen von Windows Sockets empfangen: recv, recvfrom, WSARecv und WSARecvFrom. Da Windows Sockets-Handles auch Dateihandles sind, können die Funktionen ReadFile und CRT auch zum Empfangen von PGM-Sitzungsdaten verwendet werden. Der Transport leitet Daten beim Eingang an den Empfänger weiter, solange die Daten sequenziert sind. Durch den Transport wird sichergestellt, dass die zurückgegebenen Daten zusammenhängend und frei von Duplikaten sind. Der folgende Codeausschnitt veranschaulicht einen PGM-Empfangsvorgang:

LONG        BytesRead;
    //:
BytesRead = recv (sockR, pTestBuffer, MaxBufferSize, 0);
if (BytesRead == 0)
{
    fprintf(stdout, "Session was terminated\n");
}
else if (BytesRead == SOCKET_ERROR)
{
    fprintf(stderr, "recv() failed: Error = %d\n",
            WSAGetLastError());
}

Bei Verwendung des Nachrichtenmodus (SOCK_RDM) gibt der Transport an, wann eine Teilnachricht empfangen wird, entweder mit dem WSAEMSGSIZE-Fehler oder durch Festlegen des MSG_PARTIAL-Flags bei der Rückkehr von den Funktionen WSARecv und WSARecvFrom . Wenn das letzte Fragment der vollständigen Nachricht an den Client zurückgegeben wird, wird der Fehler oder das Flag nicht angegeben.

Wenn die Sitzung ordnungsgemäß beendet wird, schlägt der Empfangsvorgang mit WSAEDISCON fehl. Wenn beim Transport Datenverlust auftritt, puffert PGM vorübergehend die Pakete außerhalb der Sequenz und versucht, die verlorenen Daten wiederherzustellen. Wenn der Datenverlust nicht wiederhergestellt werden kann, schlägt der Empfangsvorgang mit WSAECONNRESET fehl, und die Sitzung wird beendet. Die Sitzung kann aufgrund einer Vielzahl von Bedingungen zurückgesetzt werden, einschließlich der folgenden:

  • Der Empfänger oder die eingehende Verbindungsrate ist zu langsam, um mit der eingehenden Datenrate Schritt zu halten.
  • Übermäßiger Datenverlust tritt auf, möglicherweise aufgrund vorübergehender Netzwerkbedingungen, z. B. Routingprobleme, Netzwerkinstabilität usw.
  • Beim Absender tritt ein nicht behebbarer Fehler auf.
  • Eine übermäßige Ressourcenauslastung tritt auf dem lokalen Computer auf, z. B. das Überschreiten des maximal zulässigen internen Pufferspeichers oder das Auftreten einer Nicht-Ressourcen-Bedingung.
  • Ein Fehler bei der Datenkonsistenzprüfung tritt auf.
  • Fehler in einer Komponente, von der PGM abhängt, z. B. TCP/IP oder Windows Sockets.

Sowohl das erste als auch das zweite Element in der obigen Liste können dazu führen, dass der Empfänger übermäßige Pufferung ausführt, bevor die Ressourcen nicht mehr verfügbar sind oder sich letztendlich über das Fenster des Absenders hinaus bewegt.

Beenden einer PGM-Sitzung

Der PGM-Absender oder -Empfänger kann das Senden oder Empfangen von Daten beenden, indem er closesocket aufruft. Der Empfänger muss sowohl für die lauschenden als auch für die empfangenden Sockets closesocket aufrufen, um Handle-Leaks zu verhindern. Durch das Aufrufen des Herunterfahrens vor dem Aufrufen von closesocket wird sichergestellt, dass alle Daten gesendet werden, und es wird sichergestellt, dass die Reparaturdaten beibehalten werden, bis das Sendefenster über die letzte Datensequenz hinausgeht, auch wenn die Anwendung selbst beendet wird.