diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-04-21 14:33:12 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-04-21 21:04:33 +0000 |
commit | bbf11af22fff91b6f8f757a252ee4255bd018166 (patch) | |
tree | 7f8306230bfc0d37a7baa91589705c0cdd571a0c /vbench/src/vbench/core | |
parent | 33390132c1249768e445d8272bbfe421c6d2a5fc (diff) |
let socket handle handle more socket stuff
very simple Socket/SimpleSocket
stop using fastos sockets in websocket experimental code
stop using fastos sockets in vbench
Diffstat (limited to 'vbench/src/vbench/core')
-rw-r--r-- | vbench/src/vbench/core/socket.cpp | 33 | ||||
-rw-r--r-- | vbench/src/vbench/core/socket.h | 34 |
2 files changed, 41 insertions, 26 deletions
diff --git a/vbench/src/vbench/core/socket.cpp b/vbench/src/vbench/core/socket.cpp index 84975adf4ae..7306d25cf32 100644 --- a/vbench/src/vbench/core/socket.cpp +++ b/vbench/src/vbench/core/socket.cpp @@ -2,12 +2,22 @@ #include <vespa/fastos/fastos.h> #include "socket.h" +#include <vespa/vespalib/net/socket_options.h> +#include <vespa/vespalib/net/socket_spec.h> namespace vbench { +namespace { + +vespalib::SocketHandle connect(const string &host, int port) { + return vespalib::SocketSpec::from_host_port(host, port).client_address().connect(); +} + +} // namespace vbench::<unnamed> + constexpr size_t READ_SIZE = 32768; -Socket::Socket(std::unique_ptr<FastOS_SocketInterface> socket) +Socket::Socket(vespalib::SocketHandle socket) : _socket(std::move(socket)), _input(), _output(), @@ -16,35 +26,26 @@ Socket::Socket(std::unique_ptr<FastOS_SocketInterface> socket) { } -Socket::Socket(const string host, int port) - : _socket(new FastOS_Socket()), +Socket::Socket(const string &host, int port) + : _socket(connect(host, port)), _input(), _output(), _taint(), _eof(false) { - if (!_socket->SetAddressByHostName(port, host.c_str()) || - !_socket->SetSoBlocking(true) || - !_socket->Connect() || - !_socket->SetSoLinger(false, 0)) - { - _socket->Close(); + if (!_socket.valid() || !_socket.set_linger(false, 0)) { _taint.reset(strfmt("socket connect failed: host: %s, port: %d", host.c_str(), port)); + _socket.reset(); } } -Socket::~Socket() -{ - _socket->Close(); -} - Memory Socket::obtain() { if ((_input.get().size == 0) && !_eof && !_taint) { WritableMemory buf = _input.reserve(READ_SIZE); - ssize_t res = _socket->Read(buf.data, buf.size); + ssize_t res = _socket.read(buf.data, buf.size); if (res > 0) { _input.commit(res); } else if (res < 0) { @@ -75,7 +76,7 @@ Socket::commit(size_t bytes) _output.commit(bytes); while ((_output.get().size > 0) && !_taint) { Memory buf = _output.obtain(); - ssize_t res = _socket->Write(buf.data, buf.size); + ssize_t res = _socket.write(buf.data, buf.size); if (res > 0) { _output.evict(res); } else { diff --git a/vbench/src/vbench/core/socket.h b/vbench/src/vbench/core/socket.h index 092a28952f4..e961994c37a 100644 --- a/vbench/src/vbench/core/socket.h +++ b/vbench/src/vbench/core/socket.h @@ -5,10 +5,10 @@ #include "string.h" #include "stream.h" #include <vespa/vespalib/data/simple_buffer.h> +#include <vespa/vespalib/net/socket_handle.h> +#include <vespa/vespalib/net/server_socket.h> #include <memory> -class FastOS_SocketInterface; - namespace vbench { using Input = vespalib::Input; @@ -20,16 +20,15 @@ using WritableMemory = vespalib::WritableMemory; class Socket : public Stream { private: - std::unique_ptr<FastOS_SocketInterface> _socket; - SimpleBuffer _input; - SimpleBuffer _output; - Taint _taint; - bool _eof; + vespalib::SocketHandle _socket; + SimpleBuffer _input; + SimpleBuffer _output; + Taint _taint; + bool _eof; public: - Socket(std::unique_ptr<FastOS_SocketInterface> socket); - Socket(const string host, int port); - virtual ~Socket(); + Socket(vespalib::SocketHandle socket); + Socket(const string &host, int port); virtual bool eof() const override { return _eof; } virtual Memory obtain() override; virtual Input &evict(size_t bytes) override; @@ -38,5 +37,20 @@ public: virtual const Taint &tainted() const override { return _taint; } }; +struct ServerSocket { + vespalib::ServerSocket server_socket; + ServerSocket() : server_socket(0) {} + int port() const { return server_socket.address().port(); } + Stream::UP accept() { + vespalib::SocketHandle handle = server_socket.accept(); + if (handle.valid()) { + return std::make_unique<Socket>(std::move(handle)); + } else { + return Stream::UP(); + } + } + void close() { server_socket.shutdown(); } +}; + } // namespace vbench |