summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app_thread.cpp2
-rw-r--r--src/fd_signaler.cpp1
-rw-r--r--src/options.hpp2
-rw-r--r--src/pipe.cpp4
-rw-r--r--src/tcp_connecter.cpp75
-rw-r--r--src/tcp_listener.cpp1
-rw-r--r--src/tcp_socket.cpp74
-rw-r--r--src/uuid.cpp13
-rw-r--r--src/uuid.hpp11
-rw-r--r--src/zmq_connecter.cpp2
10 files changed, 162 insertions, 23 deletions
diff --git a/src/app_thread.cpp b/src/app_thread.cpp
index 58fe19d..847fcc1 100644
--- a/src/app_thread.cpp
+++ b/src/app_thread.cpp
@@ -21,6 +21,8 @@
#include "../include/zmq.h"
+#include "platform.hpp"
+
#if defined ZMQ_HAVE_WINDOWS
#include "windows.hpp"
#else
diff --git a/src/fd_signaler.cpp b/src/fd_signaler.cpp
index 771094b..3f433b8 100644
--- a/src/fd_signaler.cpp
+++ b/src/fd_signaler.cpp
@@ -21,6 +21,7 @@
#include "platform.hpp"
#include "err.hpp"
#include "fd.hpp"
+#include "ip.hpp"
#if defined ZMQ_HAVE_OPENVMS
#include <netinet/tcp.h>
diff --git a/src/options.hpp b/src/options.hpp
index 7d78da2..faf21b8 100644
--- a/src/options.hpp
+++ b/src/options.hpp
@@ -22,6 +22,8 @@
#include <string>
+#include "stdint.hpp"
+
namespace zmq
{
diff --git a/src/pipe.cpp b/src/pipe.cpp
index 3748ae9..392d380 100644
--- a/src/pipe.cpp
+++ b/src/pipe.cpp
@@ -17,9 +17,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <pthread.h>
-
-#include <../include/zmq.h>
+#include "../include/zmq.h"
#include "pipe.hpp"
diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp
index 23f3741..fa99538 100644
--- a/src/tcp_connecter.cpp
+++ b/src/tcp_connecter.cpp
@@ -26,8 +26,79 @@
#ifdef ZMQ_HAVE_WINDOWS
-#include "windows.hpp"
-#error
+zmq::tcp_connecter_t::tcp_connecter_t () :
+ s (retired_fd)
+{
+ memset (&addr, 0, sizeof (addr));
+}
+
+zmq::tcp_connecter_t::~tcp_connecter_t ()
+{
+ if (s != retired_fd)
+ close ();
+}
+
+int zmq::tcp_connecter_t::set_address (const char *addr_)
+{
+ // Convert the hostname into sockaddr_in structure.
+ return resolve_ip_hostname (&addr, addr_);
+}
+
+int zmq::tcp_connecter_t::open ()
+{
+ zmq_assert (s == retired_fd);
+
+ // Create the socket.
+ s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ // TODO: Convert error to errno.
+ wsa_assert (s != INVALID_SOCKET);
+
+ // Set to non-blocking mode.
+ unsigned long argp = 1;
+ int rc = ioctlsocket (s, FIONBIO, &argp);
+ wsa_assert (rc != SOCKET_ERROR);
+
+ // Disable Nagle's algorithm.
+ int flag = 1;
+ rc = setsockopt (s, IPPROTO_TCP, TCP_NODELAY, (char*) &flag,
+ sizeof (int));
+ wsa_assert (rc != SOCKET_ERROR);
+
+ // Connect to the remote peer.
+ rc = ::connect (s, (sockaddr*) &addr, sizeof addr);
+
+ // Connect was successfull immediately.
+ if (rc == 0)
+ return 0;
+
+ // Asynchronous connect was launched.
+ if (rc == SOCKET_ERROR && (WSAGetLastError () == WSAEINPROGRESS ||
+ WSAGetLastError () == WSAEWOULDBLOCK)) {
+ errno = EAGAIN;
+ return -1;
+ }
+
+ // TODO: Convert error to errno.
+ wsa_assert (rc == 0);
+
+ return -1;
+}
+
+int zmq::tcp_connecter_t::close ()
+{
+ zmq_assert (s != retired_fd);
+ int rc = closesocket (s);
+ wsa_assert (rc != SOCKET_ERROR);
+ s = retired_fd;
+ return 0;
+}
+
+zmq::fd_t zmq::tcp_connecter_t::get_fd ()
+{
+ return s;
+}
+
+// connect
#else
diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp
index de62879..22d47ca 100644
--- a/src/tcp_listener.cpp
+++ b/src/tcp_listener.cpp
@@ -27,7 +27,6 @@
#ifdef ZMQ_HAVE_WINDOWS
-#include "windows.hpp"
#error
#else
diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp
index 4472fa6..21f60f9 100644
--- a/src/tcp_socket.cpp
+++ b/src/tcp_socket.cpp
@@ -23,8 +23,75 @@
#ifdef ZMQ_HAVE_WINDOWS
-#include "windows.hpp"
-#error
+zmq::tcp_socket_t::tcp_socket_t () :
+ s (retired_fd)
+{
+}
+
+zmq::tcp_socket_t::~tcp_socket_t ()
+{
+ if (s != retired_fd)
+ close ();
+}
+
+int zmq::tcp_socket_t::open (fd_t fd_)
+{
+ zmq_assert (s == retired_fd);
+ s = fd_;
+ return 0;
+}
+
+int zmq::tcp_socket_t::close ()
+{
+ zmq_assert (s != retired_fd);
+ int rc = closesocket (s);
+ wsa_assert (rc != SOCKET_ERROR);
+ s = retired_fd;
+ return 0;
+}
+
+int zmq::tcp_socket_t::write (const void *data, int size)
+{
+ int nbytes = send (s, (char*) data, size, 0);
+
+ // If not a single byte can be written to the socket in non-blocking mode
+ // we'll get an error (this may happen during the speculative write).
+ if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK)
+ return 0;
+
+ // Signalise peer failure.
+ if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAECONNRESET)
+ return -1;
+
+ wsa_assert (nbytes != SOCKET_ERROR);
+
+ return (size_t) nbytes;
+}
+
+int zmq::tcp_socket_t::read (void *data, int size)
+{
+ int nbytes = recv (s, (char*) data, size, 0);
+
+ // If not a single byte can be read from the socket in non-blocking mode
+ // we'll get an error (this may happen during the speculative read).
+ if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK)
+ return 0;
+
+ // Connection failure.
+ if (nbytes == -1 && (
+ WSAGetLastError () == WSAECONNRESET ||
+ WSAGetLastError () == WSAECONNREFUSED ||
+ WSAGetLastError () == WSAENOTCONN))
+ return -1;
+
+ wsa_assert (nbytes != SOCKET_ERROR);
+
+ // Orderly shutdown by the other peer.
+ if (nbytes == 0)
+ return -1;
+
+ return (size_t) nbytes;
+}
#else
@@ -112,5 +179,4 @@ int zmq::tcp_socket_t::read (void *data, int size)
return (size_t) nbytes;
}
-#endif
-
+#endif \ No newline at end of file
diff --git a/src/uuid.cpp b/src/uuid.cpp
index 10db3bc..6abc41d 100644
--- a/src/uuid.cpp
+++ b/src/uuid.cpp
@@ -23,25 +23,28 @@
#if defined ZMQ_HAVE_WINDOWS
-#include <rpcdce.h>
-
zmq::uuid_t::uuid_t ()
{
RPC_STATUS ret = UuidCreate (&uuid);
zmq_assert (ret == RPC_S_OK);
ret = UuidToString (&uuid, &uuid_str);
zmq_assert (ret == RPC_S_OK);
+
+ /*
+ HRESULT hr = CoCreateGUID (&uuid);
+ zmq_assert (hr == S_OK);
+ int rc = StringFromGUID2 (uuid, uuid_str, 40);
+ zmq_assert (rc != 0);
+ */
}
zmq::uuid_t::~uuid_t ()
{
- RPC_STATUS ret = RpcStringFree(&uuid_str);
- assert (ret == RPC_S_OK);
}
const char *zmq::uuid_t::to_string ()
{
- return uuid_str;
+ return (char*) uuid_str;
}
#elif defined ZMQ_HAVE_FREEBSD
diff --git a/src/uuid.hpp b/src/uuid.hpp
index 79a9620..81e41a3 100644
--- a/src/uuid.hpp
+++ b/src/uuid.hpp
@@ -21,15 +21,12 @@
#define __ZMQ_UUID_HPP_INCLUDED__
#include "platform.hpp"
+#include "stdint.hpp"
-#if defined ZMQ_HAVE_WINDOWS
-#include <rpcdce.h>
-#elif defined ZMQ_HAVE_FREEBSD
+#if defined ZMQ_HAVE_FREEBSD
#include <uuid.h>
#elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX
#include <uuid/uuid.h>
-#else
-#include <stdint.h>
#endif
namespace zmq
@@ -56,8 +53,8 @@ namespace zmq
enum { uuid_string_len = 36 };
#if defined ZMQ_HAVE_WINDOWS
- ::UUID uuid;
- char *uuid_str;
+ ::UUID uuid;
+ RPC_CSTR uuid_str;
#elif defined ZMQ_HAVE_FREEBSD
::uuid_t uuid;
char *uuid_str;
diff --git a/src/zmq_connecter.cpp b/src/zmq_connecter.cpp
index e4e7eea..d15566a 100644
--- a/src/zmq_connecter.cpp
+++ b/src/zmq_connecter.cpp
@@ -106,7 +106,7 @@ void zmq::zmq_connecter_t::start_connecting ()
}
// Connection establishment may be dealyed. Poll for its completion.
- else if (rc == -1 && errno == EINPROGRESS) {
+ else if (rc == -1 && errno == EAGAIN) {
handle = add_fd (tcp_connecter.get_fd ());
handle_valid = true;
set_pollout (handle);