looking for Socket.select with maximum time or other solution
Charma
Motoko_Kusanagi at web.de
Mon Oct 8 06:15:26 PDT 2007
Regan Heath schrieb:
> Charma wrote:
>> Hello everyone!
>> I am currently working on a server which many clients can connect to
>> and i am using socket.select with my socketset which all clients are
>> in. This far everything works very fine. But i would prefer my
>> server-loop to continue e.g. at least 10 times every second to work on
>> other things even when nothing is send from clients.
>>
>> Is there anything i can do to force socket.select to stop waiting
>> after a given time even if all sockets will stay as marked with
>> nothing to receive?
>
> This version of select takes a timeout parameter of type timeval:
>
> static int select(SocketSet checkRead, SocketSet checkWrite, SocketSet
> checkError, timeval* tv);
>
> you will need to reload the sockets into the set before every call.
>
>> Maybe someone has an even better/other/different idea?!?
>>
>> Also i would like to know: Is there any way i can cancel socket.select
>> while it is waiting?
>
> I believe you could interrupt it from another thread but I don't think
> that it is necessary, simply use a short timeout period and make the
> main loop check a termination variable eg.
>
> while(!timeToStop)
> {
> select...with short timeout.
> }
>
> Of course, you need some method of setting timeToStop, perhaps you check
> for keyboard input in the main loop, perhaps a client connection
> processes a command like "shutdown"...
>
> You can use a ticker/counter variable in the main loop to restrict how
> often certain tasks are carried out, eg.
>
> ticker=0
> while(!timeToStop)
> {
> select...with timeout of 100ms (10x/sec)
> if (ticker%5 == 0) { //2x/sec
> //put stuff in here that only happens 2x/sec
> }
> ..etc..
> }
>
> It may be a cleaner design, and better in the multi-cpu enviroment we
> have today to create a thread for each task, where the thread simply
> sleeps between tasks.
>
> > I mean, i would like to be able to quit my server
>> clean without needing to connect with a client again and so on...
>
> In that case perhaps a check for keyboard input is what you want.
>
> Regan
Regan,
As usual, you had exactly what i was looking for! For some reason, i
don't know by myself, i was always overlooking that there exists a
parameter for that...
Thanks a lot! This solves my problem :)
I want to avoid using threads to keep my server as fast and efficient as
possible, so i will try to come up with something for a completly
seperate connection which will be handled different from the other
clients...
Greetings,
Charma
More information about the Digitalmars-d-learn
mailing list