+ * 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::OnEventHandler*() methods.
+ * @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 vector write function writev().
+ * This function should emulate its namesake system call exactly.
+ * @param fd EventHandler to send data with
+ * @param iov Array of IOVectors containing the buffers to send and their lengths in the platform's
+ * native format.
+ * @param count Number of elements in iov.
+ * @return This method should return exactly the same values as the system call it emulates.
+ */
+ static int WriteV(EventHandler* fd, const IOVector* iov, int count);
+
+#ifdef _WIN32
+ /** Abstraction for vector write function writev() that accepts a POSIX format iovec.
+ * This function should emulate its namesake system call exactly.
+ * @param fd EventHandler to send data with
+ * @param iov Array of iovecs containing the buffers to send and their lengths in POSIX format.
+ * @param count Number of elements in iov.
+ * @return This method should return exactly the same values as the system call it emulates.