Thread overview
looking for Socket.select with maximum time or other solution
Oct 07, 2007
Charma
Oct 07, 2007
Nathan Reed
Oct 08, 2007
Regan Heath
Oct 08, 2007
Charma
October 07, 2007
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?

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 mean, i would like to be able to quit my server clean without needing to connect with a client again and so on...

Thanks for any suggestions and help!!
Sorry about my engrish!!

Charma
October 07, 2007
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.

I'd use a separate thread for that.

> Also i would like to know: Is there any way i can cancel socket.select while it is waiting? I mean, i would like to be able to quit my server clean without needing to connect with a client again and so on...

How about, from another thread, killing the thread that is running select?  Yeah, a little bit clumsy, but at least you don't have to kill the process from the console.

Thanks,
Nathan Reed
October 08, 2007
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
October 08, 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