summaryrefslogtreecommitdiff
path: root/i/simulotron/src/socket/socket_server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'i/simulotron/src/socket/socket_server.cc')
-rw-r--r--i/simulotron/src/socket/socket_server.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/i/simulotron/src/socket/socket_server.cc b/i/simulotron/src/socket/socket_server.cc
new file mode 100644
index 0000000..c214ca7
--- /dev/null
+++ b/i/simulotron/src/socket/socket_server.cc
@@ -0,0 +1,39 @@
+#include "socket/socket_server.hh"
+#include "utils/errno_exception.hh"
+#include "socket/address.hh"
+
+#include <sys/socket.h>
+#include <cerrno>
+
+SocketServer::SocketServer(const Address & address)
+{
+ // Crée le file descriptor du socket
+ socket_ = socket (PF_INET, SOCK_STREAM, 0);
+ if(socket_ < 0)
+ throw errno_exception ("La chaussette n'a pas pu être tricoté", errno);
+
+ // On bind le socket
+ if(::bind (socket_, address.getSockaddr(), sizeof(*address.getSockaddr())) < 0)
+ throw errno_exception("Impossible d'assigner la chausette", errno);
+}
+
+SocketServer::~SocketServer(void)
+{
+ if(socket_ >= 0)
+ ::close(socket_);
+}
+
+void SocketServer::listen(int maxQueue)
+{
+ if(::listen(socket_, maxQueue) < 0 )
+ throw errno_exception("Impossible d'écouter la mer dans la chaussette", errno);
+}
+
+int SocketServer::accept(void)
+{
+ int socket = ::accept(socket_, 0, 0);
+ if (socket < 0)
+ throw errno_exception("Chaussette bloqué à la douane", errno);
+
+ return socket;
+}