00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00024
00025
00029 template <typename Type>
00030 Selector<Type>::Selector() :
00031 myMaxSocket(0)
00032 {
00033 Clear();
00034 }
00035
00036
00040 template <typename Type>
00041 void Selector<Type>::Add(Type Socket)
00042 {
00043 FD_SET(Socket.mySocket, &mySet);
00044
00045 if (static_cast<int>(Socket.mySocket) > myMaxSocket)
00046 myMaxSocket = static_cast<int>(Socket.mySocket);
00047 }
00048
00049
00053 template <typename Type>
00054 void Selector<Type>::Remove(Type Socket)
00055 {
00056 FD_CLR(Socket.mySocket, &mySet);
00057 }
00058
00059
00063 template <typename Type>
00064 void Selector<Type>::Clear()
00065 {
00066 FD_ZERO(&mySet);
00067
00068 myMaxSocket = 0;
00069 }
00070
00071
00075 template <typename Type>
00076 bool Selector<Type>::GetSocketsReady(std::vector<Type>& Sockets, float Timeout)
00077 {
00078
00079 Sockets.clear();
00080
00081
00082 timeval Time;
00083 Time.tv_sec = static_cast<long>(Timeout);
00084 Time.tv_usec = (static_cast<long>(Timeout * 1000) % 1000) * 1000;
00085
00086
00087 fd_set Set = mySet;
00088
00089
00090 if (select(myMaxSocket + 1, &Set, NULL, NULL, Timeout > 0 ? &Time : NULL) != 0)
00091 {
00092
00093 for (int i = 0; i < myMaxSocket + 1; ++i)
00094 {
00095 if (FD_ISSET(i, &Set))
00096 Sockets.push_back(Type(static_cast<priv::SocketType>(i)));
00097 }
00098
00099 return true;
00100 }
00101 else
00102 {
00103
00104 return false;
00105 }
00106 }