aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/net/socket/socket_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vespalib/src/tests/net/socket/socket_server.cpp')
-rw-r--r--vespalib/src/tests/net/socket/socket_server.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/vespalib/src/tests/net/socket/socket_server.cpp b/vespalib/src/tests/net/socket/socket_server.cpp
new file mode 100644
index 00000000000..b4d3881097f
--- /dev/null
+++ b/vespalib/src/tests/net/socket/socket_server.cpp
@@ -0,0 +1,72 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/net/socket_address.h>
+#include <vespa/vespalib/net/server_socket.h>
+#include <vespa/vespalib/net/socket.h>
+#include <vespa/vespalib/util/stringfmt.h>
+#include <vespa/vespalib/util/signalhandler.h>
+#include <vespa/vespalib/util/host_name.h>
+#include <thread>
+#include <functional>
+#include <chrono>
+
+using namespace vespalib;
+
+vespalib::string read_msg(Socket &socket) {
+ vespalib::string msg;
+ for (;;) {
+ char c;
+ ssize_t ret = socket.read(&c, 1);
+ if (ret != 1) {
+ fprintf(stderr, "error during read message\n");
+ return msg;
+ }
+ if (c == '\n') {
+ return msg;
+ }
+ msg.append(c);
+ }
+}
+
+void write_msg(Socket &socket, const vespalib::string &msg) {
+ for (size_t i = 0; i < msg.size(); ++i) {
+ ssize_t ret = socket.write(&msg[i], 1);
+ if (ret != 1) {
+ fprintf(stderr, "error during write message\n");
+ return;
+ }
+ }
+}
+
+int main(int, char **) {
+ ServerSocket::UP server = ServerSocket::listen(0);
+ if (!server->valid()) {
+ fprintf(stderr, "listen failed, exiting\n");
+ return 1;
+ }
+ fprintf(stderr, "running socket test server at host %s\n", HostName::get().c_str());
+ auto list = SocketAddress::resolve(0);
+ if (list.size() > 0) {
+ fprintf(stderr, "all local addresses:\n");
+ for (const auto &addr: list) {
+ fprintf(stderr, " %s\n", addr.spec().c_str());
+ }
+ }
+ fprintf(stderr, "listening to %s\n", server->address().spec().c_str());
+ fprintf(stderr, "client command: env $(make ldl) ./socket_client %s %d\n",
+ HostName::get().c_str(), server->address().port());
+ fprintf(stderr, "use ^C (SIGINT) to exit\n");
+ SignalHandler::INT.hook();
+ while (!SignalHandler::INT.check()) {
+ Socket::UP socket = server->accept();
+ if (socket->valid()) {
+ fprintf(stderr, "got connection from: %s (local address: %s)\n",
+ socket->peer_address().spec().c_str(), socket->address().spec().c_str());
+ fprintf(stderr, "message from client: '%s'\n", read_msg(*socket).c_str());
+ write_msg(*socket, "hello from server\n");
+ } else {
+ fprintf(stderr, "(got invalid socket from accept)\n");
+ }
+ }
+ return 0;
+}