aboutsummaryrefslogtreecommitdiffstats
path: root/vbench/src/vbench/core
diff options
context:
space:
mode:
authorHaavard <havardpe@yahoo-inc.com>2017-04-21 14:33:12 +0000
committerHaavard <havardpe@yahoo-inc.com>2017-04-21 21:04:33 +0000
commitbbf11af22fff91b6f8f757a252ee4255bd018166 (patch)
tree7f8306230bfc0d37a7baa91589705c0cdd571a0c /vbench/src/vbench/core
parent33390132c1249768e445d8272bbfe421c6d2a5fc (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.cpp33
-rw-r--r--vbench/src/vbench/core/socket.h34
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