+ * and false if it failed. This does not free the
+ * EventHandler pointer using delete, if this is
+ * required you must do this yourself.
+ * @param eh The event handler object to remove
+ */
+ static void DelFd(EventHandler* eh);
+
+ /** Returns true if a file descriptor exists in
+ * the socket engine's list.
+ * @param fd The event handler to look for
+ * @return True if this fd has an event handler
+ */
+ static bool HasFd(int fd);
+
+ /** Returns the EventHandler attached to a specific fd.
+ * If the fd isnt in the socketengine, returns NULL.
+ * @param fd The event handler to look for
+ * @return A pointer to the event handler, or NULL
+ */
+ static EventHandler* GetRef(int fd);
+
+ /** Waits for events and dispatches them to handlers. Please note that
+ * this doesn't wait long, only a couple of milliseconds. It returns the
+ * number of events which occurred during this call. This method will
+ * dispatch events to their handlers by calling their
+ * EventHandler::HandleEvent() methods with the necessary EventType
+ * value.
+ * @return The number of events which have occured.
+ */
+ static int DispatchEvents();
+
+ /** Dispatch trial reads and writes. This causes the actual socket I/O
+ * to happen when writes have been pre-buffered.
+ */
+ static void DispatchTrialWrites();
+
+ /** Returns true if the file descriptors in the given event handler are
+ * within sensible ranges which can be handled by the socket engine.
+ */
+ static bool BoundsCheckFd(EventHandler* eh);
+
+ /** Abstraction for BSD sockets accept(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param addr The client IP address and port
+ * @param addrlen The size of the sockaddr parameter.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int Accept(EventHandler* fd, sockaddr *addr, socklen_t *addrlen);
+
+ /** Close the underlying fd of an event handler, remove it from the socket engine and set the fd to -1.
+ * @param eh The EventHandler to close.
+ * @return 0 on success, a negative value on error
+ */
+ static int Close(EventHandler* eh);
+
+ /** Abstraction for BSD sockets close(2).
+ * This function should emulate its namesake system call exactly.
+ * This function should emulate its namesake system call exactly.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int Close(int fd);
+
+ /** Abstraction for BSD sockets send(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param buf The buffer in which the data that is sent is stored.
+ * @param len The size of the buffer.
+ * @param flags A flag value that controls the sending of the data.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int Send(EventHandler* fd, const void *buf, size_t len, int flags);
+
+ /** Abstraction for BSD sockets recv(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param buf The buffer in which the data that is read is stored.
+ * @param len The size of the buffer.
+ * @param flags A flag value that controls the reception of the data.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int Recv(EventHandler* fd, void *buf, size_t len, int flags);
+
+ /** Abstraction for BSD sockets recvfrom(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param buf The buffer in which the data that is read is stored.
+ * @param len The size of the buffer.
+ * @param flags A flag value that controls the reception of the data.
+ * @param from The remote IP address and port.
+ * @param fromlen The size of the from parameter.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int RecvFrom(EventHandler* fd, void *buf, size_t len, int flags, sockaddr *from, socklen_t *fromlen);
+
+ /** Abstraction for BSD sockets sendto(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param buf The buffer in which the data that is sent is stored.
+ * @param len The size of the buffer.
+ * @param flags A flag value that controls the sending of the data.
+ * @param to The remote IP address and port.
+ * @param tolen The size of the to parameter.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int SendTo(EventHandler* fd, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen);
+
+ /** Abstraction for BSD sockets connect(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param serv_addr The server IP address and port.
+ * @param addrlen The size of the sockaddr parameter.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen);
+
+ /** Make a file descriptor blocking.
+ * @param fd a file descriptor to set to blocking mode
+ * @return 0 on success, -1 on failure, errno is set appropriately.
+ */
+ static int Blocking(int fd);
+
+ /** Make a file descriptor nonblocking.
+ * @param fd A file descriptor to set to nonblocking mode
+ * @return 0 on success, -1 on failure, errno is set appropriately.
+ */
+ static int NonBlocking(int fd);
+
+ /** Abstraction for BSD sockets shutdown(2).
+ * This function should emulate its namesake system call exactly.
+ * @param fd This version of the call takes an EventHandler instead of a bare file descriptor.
+ * @param how What part of the socket to shut down
+ * @return This method should return exactly the same values as the system call it emulates.