Select-Funktion



  • Hallo, ich beschaeftige mich derzeit mit Socket-Programmierung. Bin auch mit dem Ergebnis recht zufrieden. Ich kann zwischen auf 2 verschiedenen Laptops ueber Terminal im gleichen Netwerk kommunizieren, doch.....

    ich muss jedes Mal, wenn der Client etwas sendet, eine Antwort vom Server geben.
    Nach eweiger Recherche habe ich rausgefunden, warum das so ist. (Stichwort Blocking). Jetzt zu meiner Frage, kann ich das Problem umgehen, wenn ich mich mehr mit der select Funktion auskenne? Oder bin ich da auf dem Holzweg? Lg



  • Deine Frage hat nichts mit C zu tun, außer dass es ein C-API für diese Funktion gibt.

    man 2 select schrieb:

    select() conforms to POSIX.1-2001, POSIX.1-2008, and 4.4BSD (select()
    first appeared in 4.2BSD). Generally portable to/from non-BSD
    systems supporting clones of the BSD socket layer (including System V
    variants). However, note that the System V variant typically sets
    the timeout variable before exit, but the BSD variant does not.

    pselect() is defined in POSIX.1g, and in POSIX.1-2001 and
    POSIX.1-2008.

    Deine Frage hat aber nicht zwangsläufig was mit Linux/Unix zu tun, sondern eher mit Programmlogik an sich. Mit select kannst du deine eigenen Timeouts definieren, herausfinden, wann Daten für den Socket bereitstehen, und die CPU-Last drücken. Aber das ist nur ein Baustein der Implementierung des Protokolls - dein Problem ist, dass du wissen musst, wie viele Bytes die andere Seite geschrieben hat, damit du dann diese Bytes vom Socket lesen kannst. Werden innerhalb einer bestimmten Zeit nicht genug gesendet (das kannst du dann z.B. mit select rausfinden und timen), kannst du die Verbindung neustarten lassen.

    Aber wie viele Bytes kommen sollen, musst du der anderen Seite schon irgendwie mitteilen. Entweder durch fixe Längen, eventuell noch durch die Art der Anfrage (das X-Protokoll z.B. zeigt wunderschön, wie man's NICHT macht), oder indem in jeder Nachricht die Länge irgendwie ersichtlich ist (HTTP auch als Beispiel, wie man's NICHT macht - separat zu parsende Header, und entweder Content-Length oder Chunked Transfer - so viel Code für so einen Schwachsinn).


Anmelden zum Antworten