Toon posts:

Nonblocking sockets

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

Ik heb een vraagje i.v.m nonblocking sockets. Ik maak gebruik van Winsock om verbinding te maken met een IRC server. Nu wil ik alleen data ophalen als er ook data beschikbaar is, als er uiteindelijk data is mag hij zolang mogelijk over het ontvangen doen als hij wil.

Nu gebruik ik select(...) voor het controleren van de socket op leesbaarheid. Als er een socket beschikbaar is roep ik recv(...) aan voor het inlezen van data. Nu is het probleem dat recv(...) meteen doorgaat als hij block (WSAEWOULDBLOCK). Op welke manier kan ik checken dat alle data uit de socket is gelezen?

Alvast bedankt!

Peter.

  • whoami
  • Registratie: December 2000
  • Laatst online: 06:58
Heb je geen asynchrone manier om recv aan te roepen ?

Nu ken ik winsock niet, maar je kan ook een thread maken die je socket loopt te pollen. Kijk of er een data beschikbaar is, indien ja, verwerk deze, indien niet, slaap een beetje.

https://fgheysels.github.io/


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Als je met select() erachter komt dat er data beschikbaar is, en je roept vervolgens recv() aan totdat hij zou blocken als het een blocking-socket zou zijn geweest, dan weet je dat je alle data gelezen hebt die op dit moment beschikbaar zijn. Als er nog data aankomt of in de tussentijd aan het aankomen was, dan merk je dat tijdens de volgende select().

Merk dus op dat je geen manier hebt om te bepalen of de verzender klaar is met versturen: dat onderscheid zul je moeten maken op een hoger niveau: bijv. newlines in geval van irc. Het idee is dan eigenlijk ook dat je een main-loop hebt dat niets anders doet dan select() and recv() en vervolgens besluit om af en toe eens wat echte applicatie-code uit te voeren wanneer er genoeg data voorhanden is.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 09:44
Onder windows zijn er nogal wat verschillende manieren; je kunt ook registreren welke events ( receive ) je wilt ontvangen en dan pas gaan recv'en met WSAAsyncSelect.
Je software wordt er alleen niet simpeler door :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Bedankt! Het is nu gelukt. Ik heb nu niet gebruik gemaakt van nonblocking sockets, ik kijk alleen met select of de socket klaar is om te lezen ;-).

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Maar dat heeft die select-aanroep toch geen zin...?

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-04 03:15
@Infinitive: jawel, want daarmee zorg je er voor dat je programma inactief blijft totdat er nieuwe data beschikbaar is. Als je geen select zou gebruiken, zou je steeds moeten pollen en dat is bijzonder inefficiënt.
Pagina: 1