Ach die verstehen mich ja wieder nicht (nicht so gut mein Englisch) und da die Software meine eigene ist hab ich ja die freie Auswahl was ich verwende sonst würde ich das schon versuchen. Dank git könnte ich ja auch leicht wieder zurückwechseln wenn ich noch über eine Lösung falle
.
Ich hab mal den Client umgebaut und was lustiges festgestellt.
So mach ich das jetzt mit dem lesen mit den C-Sockets:
[Edit]Vorher muß man den iSocket natürlich erzeugen (hab ich wegen der übersicht weg gelassen).[/Edit]
Code: Alles auswählen
//*****
//* Lese die neue Seite vom Subsystem.
std::string strNeueSeite = "";
int iSize = 0;
int iLength = 0;
int iContentLength = 0;
int boolHeaderLesen = true;
char szBuffer[100];
for (;;)
{
iSize = recv (iSocket, &szBuffer, sizeof (szBuffer) - 1, 0);
if (iSize == 0)
{
if (iContentLength == iLength)
break;
else
{
syslog (LOG_INFO,
"HtsCgiLogin->main: nicht alle Daten des Subs. gelesen, erwartet: '%d', gelesen: '%d'.",
iContentLength,
iLength);
exit (1);
}
}
else
if (iSize > 0)
{
// Die gelesenen Date zu einem String zusammenbauen.
szBuffer[iSize] = '\0';
strNeueSeite = strNeueSeite + szBuffer;
iLength = iLength + iSize;
// Prüfe ob alle Header gelesen wurden.
if (boolHeaderLesen)
{
int iPos = strNeueSeite.find ("\n\n", 0);
if (iPos != std::string::npos)
{
// Den content-length Header suchen und den Wert ausschneiden und einen int daraus machen.
std::string strHeaderName = "content-length:";
int iPosA = strNeueSeite.find (strHeaderName, 0);
int iPosB = strNeueSeite.find ("\n", iPosA);
iPosA = iPosA + strHeaderName.size ();
std::string strContentLength = strNeueSeite.substr (iPosA, iPosB - iPosA);
std::stringstream StringToInt (strContentLength);
StringToInt >> iContentLength;
// Zum Prüfen der Content länge die Header länge von den gelesenen Daten abziehen.
iLength = iLength - (iPos + 3);
// Header aus den gelesenen Daten entfernen.
// +2 um die zwei Newline der Trennung Header/Content mit zu entfernen.
strNeueSeite.erase (0, iPos + 2);
}
}
}
else
if (iSize == -1)
{
syslog (LOG_INFO, "HtsCgiLogin->main: Fehler beim lesen der neuen Seite.");
exit (1);
}
}
syslog (LOG_INFO, "strNeueSeite: '%s'", strNeueSeite.c_str ());
//*
//*****
Muß ja gehen Server mit Asio und Client mit C-Sockets - geht auch. Interessanterweise geht das jetzt. Die C-Sockets stört es nicht im geringsten das der Server die Verbindung beendet. Der Client kann die gesendeten Daten trotzdem noch lesen. Ich habe in einem Fachbuch jetzt auch gefunden das die Domainsockets sich so wie TCP verhalten. Also wird die Asio irgendwo mitbekommen das die Verbindung geschlossen wurde und gibt dem lesenden Client nur noch leer zurück. Ich weiss nicht ob die es so wollen oder ob es falsch ist oder sich das irgendwo einstellen lässt hab ich noch nicht herausbekommen.
Grüße
Alexander