]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/socket.h
And the bit I missed... :/
[user/henk/code/inspircd.git] / include / socket.h
index 43ed322bc26cd100f31c2ee687cd5807a53eef84..f8b15ae53cae017fd3188a53c828ff0503f20809 100644 (file)
@@ -22,6 +22,7 @@
 #include <netinet/in.h>
 #include <sstream>
 #include <string>
+#include <deque>
 #include "dns.h"
 
 /**
@@ -32,7 +33,7 @@ enum InspSocketState { I_DISCONNECTED, I_RESOLVING, I_CONNECTING, I_CONNECTED, I
 /**
  * Error types which a socket may exhibit
  */
-enum InspSocketError { I_ERR_TIMEOUT, I_ERR_SOCKET, I_ERR_CONNECT, I_ERR_BIND, I_ERR_RESOLVE };
+enum InspSocketError { I_ERR_TIMEOUT, I_ERR_SOCKET, I_ERR_CONNECT, I_ERR_BIND, I_ERR_RESOLVE, I_ERR_WRITE };
 
 /**
  * InspSocket is an extendable socket class which modules
@@ -49,6 +50,8 @@ class InspSocket
 {
 private:
 
+       std::deque<std::string> outbuffer;
+
        /**
         * The file descriptor of this socket
         */
@@ -62,7 +65,7 @@ private:
        /**
         * The hostname connected to
         */
-       std::string host;
+       char host[MAXBUF];
 
        /**
         * The port connected to, or the port
@@ -111,17 +114,12 @@ private:
         */
        char ibuf[65535];
 
-       /**
-        * The output buffer for this socket
-        */
-       std::string Buffer;
-
        /**
         * The IP address being connected
         * to stored in string form for
         * easy retrieval by accessors.
         */
-       std::string IP;
+       char IP[MAXBUF];
 
        /**
         * Client sockaddr structure used
@@ -143,7 +141,21 @@ private:
 
        /** Flushes the write buffer
         */
-       void FlushWriteBuffer();
+       bool FlushWriteBuffer();
+
+       /** Set the queue sizes
+        * This private method sets the operating system queue
+        * sizes for this socket to 65535 so that it can queue
+        * more information without application-level queueing
+        * which was required in older software.
+        */
+       void SetQueues(int nfd);
+
+       /** When the socket has been marked as closing, this flag
+        * will be set to true, then the next time the socket is
+        * examined, the socket is deleted and closed.
+        */
+       bool ClosePending;
 
 public:
 
@@ -174,7 +186,7 @@ public:
         * @param listening true to listen on the given host:port pair, or false to connect to them
         * @param maxtime Number of seconds to wait, if connecting, before the connection times out and an OnTimeout() event is generated
         */
-       InspSocket(std::string host, int port, bool listening, unsigned long maxtime);
+       InspSocket(const std::string &host, int port, bool listening, unsigned long maxtime);
 
        /**
         * This method is called when an outbound
@@ -261,7 +273,7 @@ public:
         * returns or linefeeds are appended to the string.
         * @param data The data to send
         */
-       virtual int Write(std::string data);
+       virtual int Write(const std::string &data);
 
        /**
         * If your socket is a listening socket, when a new
@@ -321,8 +333,28 @@ public:
         */
        virtual ~InspSocket();
 
+       /**
+        * This method attempts to resolve the hostname,
+        * if a hostname is given and not an IP,
+        * before a connection can occur. This method is
+        * asyncronous.
+        */
        virtual bool DoResolve();
+
+       /**
+        * This method attempts to connect to a hostname.
+        * This only occurs on a non-listening socket. This
+        * method is asyncronous.
+        */
        virtual bool DoConnect();
+
+       /**
+        * This method marks the socket closed.
+        * The next time the core examines a socket marked
+        * as closed, the socket will be closed and the 
+        * memory reclaimed.
+        */
+       void MarkAsClosed();
 };
 
 #endif