unittest pass
This commit is contained in:
		| @@ -21,10 +21,10 @@ int main(int argc, char** argv) | |||||||
|     ix::WebSocketServer server(port); |     ix::WebSocketServer server(port); | ||||||
|  |  | ||||||
|     server.setOnConnectionCallback( |     server.setOnConnectionCallback( | ||||||
|         [](ix::WebSocket& webSocket) |         [&server](ix::WebSocket& webSocket) | ||||||
|         { |         { | ||||||
|             webSocket.setOnMessageCallback( |             webSocket.setOnMessageCallback( | ||||||
|                 [&webSocket](ix::WebSocketMessageType messageType, |                 [&webSocket, &server](ix::WebSocketMessageType messageType, | ||||||
|                    const std::string& str, |                    const std::string& str, | ||||||
|                    size_t wireSize, |                    size_t wireSize, | ||||||
|                    const ix::WebSocketErrorInfo& error, |                    const ix::WebSocketErrorInfo& error, | ||||||
| @@ -46,8 +46,14 @@ int main(int argc, char** argv) | |||||||
|                     } |                     } | ||||||
|                     else if (messageType == ix::WebSocket_MessageType_Message) |                     else if (messageType == ix::WebSocket_MessageType_Message) | ||||||
|                     { |                     { | ||||||
|                         std::cerr << str << std::endl; |  | ||||||
|                         webSocket.send(str); |                         for (auto&& client : server.getClients()) | ||||||
|  |                         { | ||||||
|  |                             if (client != &webSocket) | ||||||
|  |                             { | ||||||
|  |                                 client->send(str); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             ); |             ); | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ | |||||||
| #include "IXWebSocket.h" | #include "IXWebSocket.h" | ||||||
|  |  | ||||||
| #include <sstream> | #include <sstream> | ||||||
|  | #include <future> | ||||||
|  |  | ||||||
| #include <netdb.h> | #include <netdb.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @@ -100,6 +101,8 @@ namespace ix | |||||||
|  |  | ||||||
|     void WebSocketServer::run() |     void WebSocketServer::run() | ||||||
|     { |     { | ||||||
|  |         std::future<void> f; | ||||||
|  |  | ||||||
|         for (;;) |         for (;;) | ||||||
|         { |         { | ||||||
|             // Accept a connection. |             // Accept a connection. | ||||||
| @@ -109,12 +112,18 @@ namespace ix | |||||||
|  |  | ||||||
|             if ((clientFd = accept(_serverFd, (struct sockaddr *)&client, &addressLen)) == -1) |             if ((clientFd = accept(_serverFd, (struct sockaddr *)&client, &addressLen)) == -1) | ||||||
|             { |             { | ||||||
|  |                 // FIXME: that error should be propagated | ||||||
|                 std::cerr << "WebSocketServer::run() error accepting connection: " |                 std::cerr << "WebSocketServer::run() error accepting connection: " | ||||||
|                     << strerror(errno); |                           << strerror(errno) | ||||||
|  |                           << std::endl; | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             _workers[clientFd] = std::thread(&WebSocketServer::handleConnection, this, clientFd); |             // Launch the handleConnection work asynchronously in its own thread. | ||||||
|  |             // | ||||||
|  |             // the destructor of a future returned by std::async blocks,  | ||||||
|  |             // so we need to declare it outside of this loop | ||||||
|  |             f = std::async(std::launch::async, &WebSocketServer::handleConnection, this, clientFd); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -126,14 +135,27 @@ namespace ix | |||||||
|         ix::WebSocket webSocket; |         ix::WebSocket webSocket; | ||||||
|         _onConnectionCallback(webSocket); |         _onConnectionCallback(webSocket); | ||||||
|  |  | ||||||
|  |         _clients.insert(&webSocket); | ||||||
|  |  | ||||||
|         webSocket.start(); |         webSocket.start(); | ||||||
|         webSocket.connectToSocket(fd); // FIXME: we ignore the return value |         auto status = webSocket.connectToSocket(fd); | ||||||
|  |         if (!status.success) | ||||||
|  |         { | ||||||
|  |             std::cerr << "WebSocketServer::handleConnection() error: " | ||||||
|  |                       << status.errorStr | ||||||
|  |                       << std::endl; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // We can probably do better than this busy loop, with a condition variable. |         // We can probably do better than this busy loop, with a condition variable. | ||||||
|         for (;;) |         while (webSocket.isConnected()) | ||||||
|         { |         { | ||||||
|             std::chrono::duration<double, std::milli> wait(10); |             std::chrono::duration<double, std::milli> wait(10); | ||||||
|             std::this_thread::sleep_for(wait); |             std::this_thread::sleep_for(wait); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         _clients.erase(&webSocket); | ||||||
|  |  | ||||||
|  |         std::cerr << "WebSocketServer::handleConnection() done" << std::endl; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,8 +8,9 @@ | |||||||
|  |  | ||||||
| #include <utility> // pair | #include <utility> // pair | ||||||
| #include <string> | #include <string> | ||||||
| #include <map> | #include <set> | ||||||
| #include <thread> | #include <thread> | ||||||
|  | #include <mutex> | ||||||
| #include <functional> | #include <functional> | ||||||
|  |  | ||||||
| #include "IXWebSocket.h" | #include "IXWebSocket.h" | ||||||
| @@ -28,6 +29,9 @@ namespace ix | |||||||
|         std::pair<bool, std::string> listen(); |         std::pair<bool, std::string> listen(); | ||||||
|         void run(); |         void run(); | ||||||
|  |  | ||||||
|  |         // FIXME: need mutex | ||||||
|  |         std::set<WebSocket*> getClients() { return _clients; } | ||||||
|  |  | ||||||
|     private: |     private: | ||||||
|         void handleConnection(int fd); |         void handleConnection(int fd); | ||||||
|  |  | ||||||
| @@ -39,6 +43,6 @@ namespace ix | |||||||
|         // socket for accepting connections |         // socket for accepting connections | ||||||
|         int _serverFd; |         int _serverFd; | ||||||
|  |  | ||||||
|         std::map<int, std::thread> _workers; |         std::set<WebSocket*> _clients; | ||||||
|     }; |     }; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user