summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sustrik@.(none)>2009-09-07 15:41:43 +0200
committerunknown <sustrik@.(none)>2009-09-07 15:41:43 +0200
commitf895426c1885729f4a4a20b1eb543a92915aed85 (patch)
tree25655039b193371027107c33551239caa227bcfc
parent87ccbb9fae0f9234f82f9a9ec6a215f5e73209d3 (diff)
initial changes for win port
-rw-r--r--include/zmq.h5
-rw-r--r--msvc/libzmq/libzmq.vcproj520
-rw-r--r--msvc/msvc.sln20
-rw-r--r--msvc/platform.hpp59
-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
14 files changed, 764 insertions, 25 deletions
diff --git a/include/zmq.h b/include/zmq.h
index f321fa9..a8394ed 100644
--- a/include/zmq.h
+++ b/include/zmq.h
@@ -25,7 +25,6 @@ extern "C" {
#endif
#include <stddef.h>
-#include <stdint.h>
#if defined MSC_VER && defined ZMQ_BUILDING_LIBZMQ
#define ZMQ_EXPORT __declspec(dllexport)
@@ -35,6 +34,8 @@ extern "C" {
// Maximal size of "Very Small Message". VSMs are passed by value
// to avoid excessive memory allocation/deallocation.
+// If VMSs larger than 255 bytes are required, type of 'vsm_size'
+// field in zmq_msg_t structure should be modified accordingly.
#define ZMQ_MAX_VSM_SIZE 30
// Message & notification types.
@@ -98,7 +99,7 @@ struct zmq_msg_t
{
void *content;
unsigned char shared;
- uint16_t vsm_size;
+ unsigned char vsm_size;
unsigned char vsm_data [ZMQ_MAX_VSM_SIZE];
};
diff --git a/msvc/libzmq/libzmq.vcproj b/msvc/libzmq/libzmq.vcproj
new file mode 100644
index 0000000..e1d69d7
--- /dev/null
+++ b/msvc/libzmq/libzmq.vcproj
@@ -0,0 +1,520 @@
+<?xml version="1.0" encoding="windows-1250"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="libzmq"
+ ProjectGUID="{641C5F36-32EE-4323-B740-992B651CF9D6}"
+ RootNamespace="libzmq"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="copy ..\platform.hpp ..\..\src"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ GenerateDebugInformation="true"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ CommandLine="copy ..\platform.hpp ..\..\src"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ GenerateDebugInformation="true"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\src\app_thread.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\devpoll.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\dispatcher.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\epoll.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\err.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\fd_signaler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\io_object.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\io_thread.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\ip.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\kqueue.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\object.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\options.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\owned.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\pipe.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\poll.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\select.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\session.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\socket_base.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tcp_connecter.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tcp_listener.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tcp_socket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\thread.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\uuid.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\ypollset.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_connecter.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_connecter_init.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_decoder.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_encoder.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_engine.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_listener.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_listener_init.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\..\src\app_thread.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\atomic_bitmap.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\atomic_counter.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\atomic_ptr.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\command.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\config.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\decoder.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\devpoll.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\dispatcher.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\encoder.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\epoll.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\err.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\fd.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\fd_signaler.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\i_endpoint.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\i_engine.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\i_inout.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\i_poll_events.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\i_poller.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\i_signaler.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\io_object.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\io_thread.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\ip.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\kqueue.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\msg_content.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mutex.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\object.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\options.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\owned.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\pipe.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\platform.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\poll.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\select.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\session.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\simple_semaphore.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\socket_base.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\stdint.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tcp_connecter.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tcp_listener.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\tcp_socket.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\thread.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\uuid.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\windows.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\wire.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\ypipe.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\ypollset.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\yqueue.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_connecter.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_connecter_init.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_decoder.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_encoder.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_engine.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_listener.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\zmq_listener_init.hpp"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/msvc/msvc.sln b/msvc/msvc.sln
new file mode 100644
index 0000000..e023863
--- /dev/null
+++ b/msvc/msvc.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzmq", "libzmq\libzmq.vcproj", "{641C5F36-32EE-4323-B740-992B651CF9D6}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {641C5F36-32EE-4323-B740-992B651CF9D6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {641C5F36-32EE-4323-B740-992B651CF9D6}.Debug|Win32.Build.0 = Debug|Win32
+ {641C5F36-32EE-4323-B740-992B651CF9D6}.Release|Win32.ActiveCfg = Release|Win32
+ {641C5F36-32EE-4323-B740-992B651CF9D6}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/msvc/platform.hpp b/msvc/platform.hpp
new file mode 100644
index 0000000..0555fa3
--- /dev/null
+++ b/msvc/platform.hpp
@@ -0,0 +1,59 @@
+/*
+ Copyright (c) 2007-2009 FastMQ Inc.
+
+ This file is part of 0MQ.
+
+ 0MQ is free software; you can redistribute it and/or modify it under
+ the terms of the Lesser GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ 0MQ is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ Lesser GNU General Public License for more details.
+
+ You should have received a copy of the Lesser GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __ZMQ_PLATFORM_HPP_INCLUDED__
+#define __ZMQ_PLATFORM_HPP_INCLUDED__
+
+// This is the platform definition for the Windows platform.
+// As a first step of the build process it is copied to
+// zmq directory to take place of platform.hpp generated from
+// platform.hpp.in on platforms supported by GNU autotools.
+
+#define ZMQ_HAVE_WINDOWS
+#define _WINSOCKAPI_
+#define NOMINMAX
+#define _CRT_SECURE_NO_WARNINGS
+
+// Turn on only the items zmq needs on the Windows platform.
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#ifndef NOMCX // No Modem Configuration Extensions.
+#define NOMCX
+#endif
+#ifndef NOIME // No Input Method Editor.
+#define NOIME
+#endif
+#ifndef NOSOUND // No Sound driver routines.
+#define NOSOUND
+#endif
+
+#include <windows.h>
+#include <objbase.h>
+
+// Enable winsock (not included when WIN32_LEAN_AND_MEAN is defined).
+#if(_WIN32_WINNT >= 0x0400)
+#include <winsock2.h>
+#include <mswsock.h>
+#else
+#include <winsock.h>
+#endif
+
+#endif
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);