Socket Programmierung => select()



  • Hallo Leute,

    ich will einen TCP Server auf eine SPS implementieren. Dazu liegen mir die notwendigen Socket Funktionen zur Verfügung.
    Als Grundlage habe ich mich daran halten wollen:
    https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rzab6/xnonblock.htm

    Nun habe ich aber die Funktion select() noch nicht ganz verstanden.

    Vorher aber noch einige Fragen:

    1. Ich habe eine Socket aufgemacht create(), bind(), listen(), accept() => und habe ein Socket Handle. Wenn nun eine Verbindung angenommen wird via accept(), dann bekommen ich ein ClientHandle zurück. Ist das nun eine weiters Socket??

    2. Nun zum Select(). Hier habe ich eine fd_set. liefert mit Select() ne 1, dann prüfe ich ob ich ein weiter Accept() mache, liefert mir Select()> 1 , dann habe ich wartende Client Sockets!? Richtig?

    3. Ist die FD_SEet Structure eine art Queue. welche mir die select() Funktion bei jedem aufruf füllt? Oder muss ich selber bei jedem accept() eine ClientSocket anhängen?

    4. Ich habe keine Funktionen bzw. Markos wie FD_ISSET?? die müsste ich selbst implementieren, ab ich weiß nicht was die genau prüft.

    Ich bin mir generell nicht ganz im klaren wer die FD_SET Struktur mit Daten füttere.. ICH oder die select() Funktion.

    Danke für eure Hilfe:)



    1. Ja, der Socket auf dem du listen aufrufst, ist das Einfallstor für Clients sich mit deinem Server zu verbinden. Erfolgreiche Verbindung mit einem Client erzeugt einen neuen Handle.

    Die Makros wie FD_ISSET müssen von der Library zur Verfügung gestellt werden; du solltest die nicht selbst definieren.
    Meine Empfehlung: verwende kein select, wenn es Alternativen gibt. poll ist deutlich einfacher zu verwenden und sollte es auch fast überall geben.



  • Dieser Beitrag wurde gelöscht!


  • Guten Morgen,

    leider habe ich keine poll() Funktion . Deswegen muss ich es mit select() machen. Muss ich denn wenn mit accept() eine neue Verbindung liefert, diesen handle manuel in der fd ablegen? und select() durchläuft diese lieste?


Anmelden zum Antworten