vom Socket lesen -- "if (connect(fd, (struct sockaddr*)&remote, sizeof(remote)) < 0) {"



  • Hallo,

    bin gerade dabei an einer Socket Anwendung zu arbeiten. Ziel ist es einen Datenstrom z.B.( 519/0x207 : sD : 00 00 01 28 01 28 01 28) auf einem Server an Port 7235 gezielt lesen zu können. Das läuft so weit alles. Was ich nicht verstehe ist, ich habe das Gefühl bei "len = recv(fd, returnstring, sizeof(returnstring), 0);" nicht den derzeit gerade angebotenen Datensatz zu lesen, sondern jeden Datensatz nacheinander abzuarbeiten. 😞 Ist diese der Fall? Wie kann ich einen aktuellen Datensatz lesen, ohne die zwischendurch über den Socket gegangenen Nachrichten verwenden zu müssen?

    Dank und Gruß Markus



  • Das ist nicht leicht. Was recv macht ist im Grunde einfach n Bytes aus dem Socket-Buffer zu lesen. Wenn du Daten nun vorschieben willst, musst du mit Out Of Band-Paketen (OOB) arbeiten.



  • Hallo,

    besten Dank. Es ist also so, dass recv(fd, ..) eine Nachricht nach der anderen aus dem "Speicher des Socket" liest? Meine Applikation hatte ich erst schon mal in Freepascal geschrieben. Dort war das etwas anders. Man konnte den aktuellen Wert der auf dem Socket lag einfach einlesen. Das sah etwa so aus:

    conek:=0;
    Addr.family:=AF_INET;
    Addr.port:=17180; (* 7235 shl 8; 😉
    while (millisekundex < helptime) do
    begin
    ....
    readln (Siin,line);
    ...
    writeln(Soout,LineA);
    flush(Soout);
    close (Siin);
    close (Soout);
    end;
    ....

    Gibt es eine Möglichkeit nach dem Lesen den Socket zu schließen und danach z.B. ca. 100ms wieder zu öffnen? Ist wahrscheinlich nicht zu sinnvoll, oder? Beim Freepascal wurde z.B. erst mal in die Variable geschrieben und dann zielgerichtet das reine Senden aktiviert. Ich habe auch Probleme mit dem C Programm, das es den Server bei der Socketarbeit deutlich mehr belastet, bis hin das der Server hängt. Wobei nicht mehr Daten und Anfragen laufen. Das Problem trat beim Freepascal Code nie auf. Am Server kann ich leider nichts machen, kommt nicht von mir. Doch was mit dem Freepascal geht, muss doch mit C mindestens genauso gut funktionieren. Ich habe das Gefühl, das Freepascal den kompletten String sofort auf den Socket legt. Kann es sein, dass beim C da eventuell segmentweise mit Unterbrechungen auf den Socket geschrieben wird? Eventuell sollte ich einen anderen Ansatz zum Auslesen von Daten aus dem Socket aller 90..100ms wählen? Nur weiss ich nicht recht wie ? 😕

    Gruß Markus


Anmelden zum Antworten