version_2.0

Dependents:   cc3000_ping_demo_try_2

Fork of cc3000_hostdriver_mbedsocket by Martin Kojtal

Revision:
5:245ac5b73132
Parent:
0:615c697c33b0
Child:
29:c40918cd9b6d
--- a/Socket/TCPSocketServer.cpp	Sat Sep 21 15:01:05 2013 +0000
+++ b/Socket/TCPSocketServer.cpp	Thu Sep 26 19:50:37 2013 +0000
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012 mbed.org, MIT License
+/* Copyright (C) 2013 mbed.org, MIT License
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
  * and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -19,18 +19,64 @@
 #include "TCPSocketServer.h"
 #include <string>
 
-TCPSocketServer::TCPSocketServer() {}
-
-// Server initialization
-int TCPSocketServer::bind(int port) {
+TCPSocketServer::TCPSocketServer() {
 
 }
 
-int TCPSocketServer::listen(int backlog) {
+int TCPSocketServer::bind(int port) {
+    if (init_socket(SOCK_STREAM, IPPROTO_TCP) < 0) {
+        return -1;
+    }
+
+    sockaddr_in localHost;
+    memset(&localHost, 0, sizeof(localHost));
+
+    localHost.sin_family = AF_INET;
+    localHost.sin_port = htons(port);
+    localHost.sin_addr.s_addr = 0;
 
+    if (_cc3000_module->_socket.bind(_sock_fd, (const sockaddr *)&localHost, sizeof(localHost)) < 0) {
+        close();
+        return -1;
+    }
+
+    return 0;
+}
+
+int TCPSocketServer::listen(int max) {
+    if (_sock_fd < 0) {
+        return -1;
+    }
+
+    if (_cc3000_module->_socket.listen(_sock_fd, max) < 0) {
+        close();
+        return -1;
+    }
+
+    return 0;
 }
 
 
 int TCPSocketServer::accept(TCPSocketConnection& connection) {
+    if (_sock_fd < 0) {
+        return -1;
+    }
 
+    if (!_blocking) {
+        TimeInterval timeout(_timeout);
+        if (wait_readable(timeout) != 0) {
+            return -1;
+        }
+    }
+
+    connection.reset_address();
+    socklen_t newSockRemoteHostLen = sizeof(connection._remote_host);
+    int fd = _cc3000_module->_socket.accept(_sock_fd, (sockaddr *) &connection._remote_host, &newSockRemoteHostLen);
+    if (fd < 0) {
+        return -1;
+    }
+    connection._sock_fd = fd;
+    connection._is_connected = true;
+
+    return 0;
 }