Merge pull request #114 from githublaohu/unit-test-protocol-3

diff --git a/Win32/AsyncProducer.vcxproj b/Win32/AsyncProducer.vcxproj
deleted file mode 100644
index 505e282..0000000
--- a/Win32/AsyncProducer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{AC059D17-1D30-4D83-AE00-5FFFE3ED50A9}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/AsyncProducer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/AsyncPushConsumer.vcxproj b/Win32/AsyncPushConsumer.vcxproj
deleted file mode 100644
index f51af91..0000000
--- a/Win32/AsyncPushConsumer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{19D42952-0418-4162-92EA-6B601B11847C}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/AsyncPushConsumer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/OrderProducer.vcxproj b/Win32/OrderProducer.vcxproj
deleted file mode 100644
index 3b264db..0000000
--- a/Win32/OrderProducer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{7BB3595B-CF36-4F12-8F12-897342C643CD}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/OrderProducer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/OrderlyPushConsumer.vcxproj b/Win32/OrderlyPushConsumer.vcxproj
deleted file mode 100644
index a9a3af3..0000000
--- a/Win32/OrderlyPushConsumer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{F1657573-16CB-440E-9CAD-E6333141377D}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/OrderlyPushConsumer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/Producer.vcxproj b/Win32/Producer.vcxproj
deleted file mode 100644
index 2e25b25..0000000
--- a/Win32/Producer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{52063BCB-8547-463D-AADA-A086B5339167}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/Producer.c" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/PullConsumer.vcxproj b/Win32/PullConsumer.vcxproj
deleted file mode 100644
index 73c1f29..0000000
--- a/Win32/PullConsumer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{B167E18F-71BE-4873-A806-6B340C5838EF}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/PullConsumer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/PushConsumeMessage.vcxproj b/Win32/PushConsumeMessage.vcxproj
deleted file mode 100644
index 7a98c38..0000000
--- a/Win32/PushConsumeMessage.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{00DA7C52-1EB6-46B5-9D2A-177E6A81F598}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/PushConsumeMessage.c" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/PushConsumer.vcxproj b/Win32/PushConsumer.vcxproj
deleted file mode 100644
index 50b9603..0000000
--- a/Win32/PushConsumer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{07CA501C-90B7-45A5-BC89-886ACB3B30CC}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/PushConsumer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/SendDelayMsg.vcxproj b/Win32/SendDelayMsg.vcxproj
deleted file mode 100644
index 5c0d524..0000000
--- a/Win32/SendDelayMsg.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{0B156CC7-A991-4554-A29D-8CD0ED982773}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/SendDelayMsg.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/SyncProducer.vcxproj b/Win32/SyncProducer.vcxproj
deleted file mode 100644
index 5f42dec..0000000
--- a/Win32/SyncProducer.vcxproj
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{C281AB41-79DE-49DD-AEEF-F300C0580D18}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140_xp</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="Shared">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(WindowsSDK_IncludePath)</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(LibraryPath)</LibraryPath>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>true</LinkIncremental>
-    <IncludePath>$(WindowsSdk_71A_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(VC_IncludePath);$(VC_IncludePath);</IncludePath>
-    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib;$(SolutionDir)$(Configuration);$(VC_LibraryPath_x86)</LibraryPath>
-    <TargetName>$(ProjectName)</TargetName>
-    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)include</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;ROCKETMQCLIENT_IMPORT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>$(SolutionDir)..\example;$(SolutionDir)..\include</AdditionalIncludeDirectories>
-      <Optimization>MaxSpeed</Optimization>
-    </ClCompile>
-    <Link>
-      <TargetMachine>MachineX86</TargetMachine>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Console</SubSystem>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>rocketmq-client-cpp.lib;%(AdditionalDependencies)</AdditionalDependencies>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="../example/SyncProducer.cpp" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/Win32/rocketmq-client-cpp.sln b/Win32/rocketmq-client-cpp.sln
index bf7bdb6..a0858b1 100644
--- a/Win32/rocketmq-client-cpp.sln
+++ b/Win32/rocketmq-client-cpp.sln
@@ -20,6 +20,11 @@
 		{DFF2BED1-4A9E-4B0B-B1EC-F01D70457E13} = {DFF2BED1-4A9E-4B0B-B1EC-F01D70457E13}
 	EndProjectSection
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "COrderlyAsyncProducer", "COrderlyAsyncProducer.vcxproj", "{F1657573-16CB-440E-9CAD-E6333141387D}"
+	ProjectSection(ProjectDependencies) = postProject
+		{DFF2BED1-4A9E-4B0B-B1EC-F01D70457E13} = {DFF2BED1-4A9E-4B0B-B1EC-F01D70457E13}
+	EndProjectSection
+EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OrderProducer", "OrderProducer.vcxproj", "{7BB3595B-CF36-4F12-8F12-897342C643CD}"
 	ProjectSection(ProjectDependencies) = postProject
 		{DFF2BED1-4A9E-4B0B-B1EC-F01D70457E13} = {DFF2BED1-4A9E-4B0B-B1EC-F01D70457E13}
@@ -99,6 +104,14 @@
 		{F1657573-16CB-440E-9CAD-E6333141377D}.Release|x64.Build.0 = Release|x64
 		{F1657573-16CB-440E-9CAD-E6333141377D}.Release|x86.ActiveCfg = Release|Win32
 		{F1657573-16CB-440E-9CAD-E6333141377D}.Release|x86.Build.0 = Release|Win32
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Debug|x64.ActiveCfg = Debug|x64
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Debug|x64.Build.0 = Debug|x64
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Debug|x86.ActiveCfg = Debug|Win32
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Debug|x86.Build.0 = Debug|Win32
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Release|x64.ActiveCfg = Release|x64
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Release|x64.Build.0 = Release|x64
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Release|x86.ActiveCfg = Release|Win32
+		{F1657573-16CB-440E-9CAD-E6333141387D}.Release|x86.Build.0 = Release|Win32
 		{7BB3595B-CF36-4F12-8F12-897342C643CD}.Debug|x64.ActiveCfg = Debug|x64
 		{7BB3595B-CF36-4F12-8F12-897342C643CD}.Debug|x64.Build.0 = Debug|x64
 		{7BB3595B-CF36-4F12-8F12-897342C643CD}.Debug|x86.ActiveCfg = Debug|Win32
diff --git a/Win32/rocketmq-client-cpp.vcxproj b/Win32/rocketmq-client-cpp.vcxproj
index 014f91f..720aab4 100644
--- a/Win32/rocketmq-client-cpp.vcxproj
+++ b/Win32/rocketmq-client-cpp.vcxproj
@@ -35,12 +35,12 @@
     <PlatformToolset>v140_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <PlatformToolset>v140</PlatformToolset>
   </PropertyGroup>
@@ -73,20 +73,33 @@
     <LibraryPath>$(WindowsSdk_71A_LibraryPath_x86);$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib</LibraryPath>
     <IntDir>$(Configuration)\$(ProjectName)</IntDir>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>$(WindowsSdk_71A_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(SolutionDir)..\include;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\include;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\WIN32-Code\;$(SolutionDir)..\src\common;$(SolutionDir)..\src\consumer;$(SolutionDir)..\src\log;$(SolutionDir)..\src\message;$(SolutionDir)..\src\producer;$(SolutionDir)..\src\protocol;$(SolutionDir)..\src\thread;$(SolutionDir)..\src\transport;$(SolutionDir)..\thirdparty\jsoncpp-0.10.6\;$(SolutionDir)..\src;$(SolutionDir)..\libs\signature\include;$(VC_IncludePath)</IncludePath>
+    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x64);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib</LibraryPath>
+    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
+  </PropertyGroup>
+    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <IncludePath>$(WindowsSdk_71A_IncludePath);$(WindowsSDK_IncludePath);$(SolutionDir)..\thirdparty\boost_1_58_0;$(SolutionDir)..\include;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\include;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\WIN32-Code\;$(SolutionDir)..\src\common;$(SolutionDir)..\src\consumer;$(SolutionDir)..\src\log;$(SolutionDir)..\src\message;$(SolutionDir)..\src\producer;$(SolutionDir)..\src\protocol;$(SolutionDir)..\src\thread;$(SolutionDir)..\src\transport;$(SolutionDir)..\thirdparty\jsoncpp-0.10.6\;$(SolutionDir)..\src;$(SolutionDir)..\libs\signature\include;$(VC_IncludePath)</IncludePath>
+    <LibraryPath>$(WindowsSdk_71A_LibraryPath_x64);$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;$(SolutionDir)..\thirdparty\boost_1_58_0\stage\lib</LibraryPath>
+    <IntDir>$(Configuration)\$(ProjectName)</IntDir>
+  </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <PreprocessorDefinitions>WIN32;_DEBUG;ROCKETMQCLIENT_EXPORTS;_WIN32_WINNT=0x501;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
       <Optimization>Disabled</Optimization>
+      <AdditionalOptions>/MDd %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
       <TargetMachine>MachineX86</TargetMachine>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <SubSystem>Console</SubSystem>
       <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\$(Configuration)\libevent.lib;$(SolutionDir)..\thirdparty\jsoncpp-0.10.6\$(Configuration)\jsoncpp_lib_static.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalOptions>/NODEFAULTLIB:library %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalOptions> /NODEFAULTLIB:library %(AdditionalOptions)</AdditionalOptions>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -105,6 +118,44 @@
       <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\$(Configuration)\libevent.lib;$(SolutionDir)..\thirdparty\jsoncpp-0.10.6\$(Configuration)\jsoncpp_lib_static.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;NDEBUG;ROCKETMQCLIENT_EXPORTS;_WIN32_WINNT=0x501;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <AdditionalOptions>/FS %(AdditionalOptions)</AdditionalOptions>
+    </ClCompile>
+    <Link>
+      <TargetMachine>MachineX64</TargetMachine>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\$(Platform)\$(Configuration)\libevent.lib;$(SolutionDir)..\thirdparty\jsoncpp-0.10.6\$(Platform)\$(Configuration)\jsoncpp_lib_static.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  
+  
+    <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;_DEBUG;ROCKETMQCLIENT_EXPORTS;_WIN32_WINNT=0x501;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <Optimization>Disabled</Optimization>
+      <AdditionalOptions>/FS /MDd %(AdditionalOptions)</AdditionalOptions>
+    </ClCompile>
+    <Link>
+      <TargetMachine>MachineX64</TargetMachine>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;$(SolutionDir)..\thirdparty\libevent-release-2.0.22\$(Configuration)\libevent.lib;$(SolutionDir)..\thirdparty\jsoncpp-0.10.6\$(Configuration)\jsoncpp_lib_static.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalOptions> /NODEFAULTLIB:library %(AdditionalOptions)</AdditionalOptions>
+    </Link>
+  </ItemDefinitionGroup>
+  
+
   <ItemGroup>
     <ClCompile Include="..\libs\signature\src\base64.c" />
     <ClCompile Include="..\libs\signature\src\hmac.c" />
diff --git a/example/COrderlyAsyncProducer.c b/example/COrderlyAsyncProducer.c
new file mode 100644
index 0000000..f841878
--- /dev/null
+++ b/example/COrderlyAsyncProducer.c
@@ -0,0 +1,96 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#include <stdio.h>
+#include "CProducer.h"
+#include "CCommon.h"
+#include "CMessage.h"
+#include "CSendResult.h"
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <memory.h>
+#endif
+
+void thread_sleep(unsigned milliseconds) {
+#ifdef _WIN32
+    Sleep(milliseconds);
+#else
+    usleep(milliseconds * 1000);  // takes microseconds
+#endif
+}
+
+void SendSuccessCallback(CSendResult result){
+    printf("async send success, msgid:%s\n", result.msgId);
+}
+
+void SendExceptionCallback(CMQException e){
+    char msg[1024];
+    snprintf(msg, sizeof(msg), "error:%d, msg:%s, file:%s:%d", e.error, e.msg, e.file, e.line);
+    printf("async send exception %s\n", msg);
+}
+
+int aQueueSelectorCallback(int size, CMessage *msg, void *arg){
+    return 0;
+};
+
+void StartSendMessage(CProducer *producer) {
+    int i = 0;
+    int ret_code = 0;
+    char body[128];
+    CMessage *msg = CreateMessage("topic_COrderlyAsyncProducer");
+    SetMessageTags(msg, "Test_Tag");
+    SetMessageKeys(msg, "Test_Keys");
+    for (i = 0; i < 10; i++) {
+        memset(body, 0, sizeof(body));
+        snprintf(body, sizeof(body), "new message body, index %d", i);
+        SetMessageBody(msg, body);
+        ret_code = SendMessageOrderlyAsync(producer, msg,
+        aQueueSelectorCallback,
+        (void*)&i,
+         SendSuccessCallback , SendExceptionCallback);
+        printf("async send message[%d] return code: %d\n", i, ret_code);
+        thread_sleep(1000);
+    }
+    DestroyMessage(msg);
+}
+
+void CreateProducerAndStartSendMessage(int i){
+    printf("Producer Initializing.....\n");
+    CProducer *producer = CreateProducer("FooBarGroup1");
+    SetProducerNameServerAddress(producer, "192.168.0.149:9876");
+    if(i == 1){
+        SetProducerSendMsgTimeout(producer , 3);
+    }
+    StartProducer(producer);
+    printf("Producer start.....\n");
+    StartSendMessage(producer);
+    ShutdownProducer(producer);
+    DestroyProducer(producer);
+    printf("Producer Shutdown!\n");
+}
+
+int main(int argc, char *argv[]) {
+    printf("COrderlyAsyncProducer successCallback.....\n");
+    CreateProducerAndStartSendMessage(0);
+
+    printf("COrderlyAsyncProducer exceptionCallback.....\n");
+    CreateProducerAndStartSendMessage(1);
+    return 0;
+}
+
diff --git a/include/CCommon.h b/include/CCommon.h
index 8b7136b..a1864b9 100644
--- a/include/CCommon.h
+++ b/include/CCommon.h
@@ -36,7 +36,8 @@
     PRODUCER_SEND_SYNC_FAILED = 11,
     PRODUCER_SEND_ONEWAY_FAILED = 12,
     PRODUCER_SEND_ORDERLY_FAILED = 13,
-    PRODUCER_SEND_ASYNC_FAILED = 14,
+	PRODUCER_SEND_ASYNC_FAILED = 14,
+    PRODUCER_SEND_ORDERLYASYNC_FAILED = 15,
 
     PUSHCONSUMER_ERROR_CODE_START = 20,
     PUSHCONSUMER_START_FAILED = 20,
diff --git a/include/CProducer.h b/include/CProducer.h
index e75622c..5518a56 100644
--- a/include/CProducer.h
+++ b/include/CProducer.h
@@ -54,6 +54,10 @@
 ROCKETMQCLIENT_API int SendMessageAsync(CProducer *producer, CMessage *msg, CSendSuccessCallback cSendSuccessCallback , CSendExceptionCallback cSendExceptionCallback);
 ROCKETMQCLIENT_API int SendMessageOneway(CProducer *producer,CMessage *msg);
 ROCKETMQCLIENT_API int SendMessageOrderly(CProducer *producer, CMessage *msg, QueueSelectorCallback callback, void *arg, int autoRetryTimes, CSendResult *result);
+
+
+ROCKETMQCLIENT_API int SendMessageOrderlyAsync(CProducer *producer,CMessage *msg,QueueSelectorCallback callback,void *arg,CSendSuccessCallback cSendSuccessCallback,CSendExceptionCallback cSendExceptionCallback );
+
 #ifdef __cplusplus
 };
 #endif
diff --git a/src/MQClientFactory.cpp b/src/MQClientFactory.cpp
index 4eccf34..2dd7bdb 100644
--- a/src/MQClientFactory.cpp
+++ b/src/MQClientFactory.cpp
@@ -631,35 +631,38 @@
   return "";
 }
 
-FindBrokerResult* MQClientFactory::findBrokerAddressInSubscribe(
-    const string& brokerName, int brokerId, bool onlyThisBroker) {
-  string brokerAddr;
-  bool slave = false;
-  bool found = false;
-  BrokerAddrMAP brokerTable(getBrokerAddrMap());
+FindBrokerResult *MQClientFactory::findBrokerAddressInSubscribe(const string &brokerName,
+                                                                int brokerId,
+                                                                bool onlyThisBroker) {
+    string brokerAddr;
+    bool slave = false;
+    bool found = false;
+    BrokerAddrMAP brokerTable(getBrokerAddrMap());
 
-  if (brokerTable.find(brokerName) != brokerTable.end()) {
-    map<int, string> brokerMap(brokerTable[brokerName]);
-    map<int, string>::iterator it1 = brokerMap.find(brokerId);
-    if (it1 != brokerMap.end()) {
-      brokerAddr = it1->second;
-      slave = (brokerId != MASTER_ID);
-      found = true;
-    } else  // from master
-    {
-      it1 = brokerMap.find(MASTER_ID);
-      if (it1 != brokerMap.end()) {
-        brokerAddr = it1->second;
-        slave = false;
-        found = true;
-      }
+    if (brokerTable.find(brokerName) != brokerTable.end()) {
+        map<int, string> brokerMap(brokerTable[brokerName]);
+        if (!brokerMap.empty()) {
+            auto iter = brokerMap.find(brokerId);
+            if (iter != brokerMap.end()) {
+                brokerAddr = iter->second;
+                slave = (brokerId != MASTER_ID);
+                found = true;
+            } else if (!onlyThisBroker) {  // not only from master
+                iter = brokerMap.begin();
+                brokerAddr = iter->second;
+                slave = iter->first != MASTER_ID;
+                found = true;
+            }
+        }
     }
-  }
 
-  brokerTable.clear();
-  if (found) return new FindBrokerResult(brokerAddr, slave);
+    brokerTable.clear();
 
-  return NULL;
+    if (found) {
+        return new FindBrokerResult(brokerAddr, slave);
+    }
+
+    return nullptr;
 }
 
 FindBrokerResult* MQClientFactory::findBrokerAddressInAdmin(
diff --git a/src/consumer/Rebalance.cpp b/src/consumer/Rebalance.cpp
index 3460457..b4e6360 100644
--- a/src/consumer/Rebalance.cpp
+++ b/src/consumer/Rebalance.cpp
@@ -275,6 +275,10 @@
     unique_ptr<FindBrokerResult> pFindBrokerResult(
         m_pClientFactory->findBrokerAddressInSubscribe(itb->first, MASTER_ID,
                                                        true));
+    if (!pFindBrokerResult) {
+      LOG_ERROR("unlockAll findBrokerAddressInSubscribe ret null for broker:%s", itb->first.data());
+      continue;
+    }
     unique_ptr<UnlockBatchRequestBody> unlockBatchRequest(
         new UnlockBatchRequestBody());
     vector<MQMessageQueue> mqs(*(itb->second));
@@ -307,6 +311,10 @@
   unique_ptr<FindBrokerResult> pFindBrokerResult(
       m_pClientFactory->findBrokerAddressInSubscribe(mq.getBrokerName(),
                                                      MASTER_ID, true));
+  if (!pFindBrokerResult) {
+    LOG_ERROR("unlock findBrokerAddressInSubscribe ret null for broker:%s", mq.getBrokerName().data());
+    return;
+  }
   unique_ptr<UnlockBatchRequestBody> unlockBatchRequest(
       new UnlockBatchRequestBody());
   vector<MQMessageQueue> mqs;
@@ -352,9 +360,14 @@
   LOG_INFO("LockAll " SIZET_FMT " broker mqs", brokerMqs.size());
   for (map<string, vector<MQMessageQueue>*>::iterator itb = brokerMqs.begin();
        itb != brokerMqs.end(); ++itb) {
+    string brokerName = (*(itb->second))[0].getBrokerName();
     unique_ptr<FindBrokerResult> pFindBrokerResult(
         m_pClientFactory->findBrokerAddressInSubscribe(
-            (*(itb->second))[0].getBrokerName(), MASTER_ID, true));
+                brokerName, MASTER_ID, true));
+    if (!pFindBrokerResult) {
+      LOG_ERROR("lockAll findBrokerAddressInSubscribe ret null for broker:%s", brokerName.data());
+      continue;
+    }
     unique_ptr<LockBatchRequestBody> lockBatchRequest(
         new LockBatchRequestBody());
     lockBatchRequest->setClientId(m_pConsumer->getMQClientId());
@@ -391,6 +404,10 @@
   unique_ptr<FindBrokerResult> pFindBrokerResult(
       m_pClientFactory->findBrokerAddressInSubscribe(mq.getBrokerName(),
                                                      MASTER_ID, true));
+  if (!pFindBrokerResult) {
+    LOG_ERROR("lock findBrokerAddressInSubscribe ret null for broker:%s", mq.getBrokerName().data());
+    return false;
+  }
   unique_ptr<LockBatchRequestBody> lockBatchRequest(new LockBatchRequestBody());
   lockBatchRequest->setClientId(m_pConsumer->getMQClientId());
   lockBatchRequest->setConsumerGroup(m_pConsumer->getGroupName());
diff --git a/src/extern/CProducer.cpp b/src/extern/CProducer.cpp
index edcc42a..de2cfe0 100644
--- a/src/extern/CProducer.cpp
+++ b/src/extern/CProducer.cpp
@@ -197,6 +197,36 @@
 }
 
 int
+SendMessageOrderlyAsync(CProducer *producer,
+            CMessage *msg,
+            QueueSelectorCallback callback,
+            void *arg,
+            CSendSuccessCallback cSendSuccessCallback,
+            CSendExceptionCallback cSendExceptionCallback                    
+                    ) {
+    if (producer == NULL || msg == NULL || callback == NULL || cSendSuccessCallback == NULL || cSendExceptionCallback == NULL) {
+        return NULL_POINTER;
+    }
+    DefaultMQProducer *defaultMQProducer = (DefaultMQProducer *) producer;
+    MQMessage *message = (MQMessage *) msg;
+        CSendCallback* cSendCallback = new CSendCallback(cSendSuccessCallback , cSendExceptionCallback);
+
+    try {
+        //Constructing SelectMessageQueue objects through function pointer callback
+        SelectMessageQueue selectMessageQueue(callback);
+        defaultMQProducer->send(*message,
+         &selectMessageQueue, arg,cSendCallback);
+    } catch (exception &e) {
+        printf("%s\n",e.what());
+        //std::count<<e.what( )<<std::endl;
+        return PRODUCER_SEND_ORDERLYASYNC_FAILED;
+    }
+    return OK;
+}
+
+
+
+int
 SendMessageOrderly(CProducer *producer, CMessage *msg, QueueSelectorCallback callback, void *arg, int autoRetryTimes,
                    CSendResult *result) {
     if (producer == NULL || msg == NULL || callback == NULL || arg == NULL || result == NULL) {
diff --git a/src/protocol/KVTable.h b/src/protocol/KVTable.h
index 69191b7..6cc557f 100755
--- a/src/protocol/KVTable.h
+++ b/src/protocol/KVTable.h
@@ -21,21 +21,24 @@
 #include <string>
 #include "RemotingSerializable.h"
 
+using std::map;
+using std::string;
+
 namespace rocketmq {
 //<!***************************************************************************
 class KVTable : public RemotingSerializable {
- public:
-  virtual ~KVTable() { m_table.clear(); }
+   public:
+    virtual ~KVTable() { m_table.clear(); }
 
-  void Encode(string& outData) {}
+    void Encode(string &outData) {}
 
-  const map<string, string>& getTable() { return m_table; }
+    const map<string, string> &getTable() { return m_table; }
 
-  void setTable(const map<string, string>& table) { m_table = table; }
+    void setTable(const map<string, string> &table) { m_table = table; }
 
- private:
-  map<string, string> m_table;
+   private:
+    map<string, string> m_table;
 };
-}  //<!end namespace;
+}  // namespace rocketmq
 
 #endif
diff --git a/src/protocol/TopicRouteData.h b/src/protocol/TopicRouteData.h
index ec8f842..9f70698 100755
--- a/src/protocol/TopicRouteData.h
+++ b/src/protocol/TopicRouteData.h
@@ -17,161 +17,147 @@
 #ifndef __TOPICROUTEDATA_H__
 #define __TOPICROUTEDATA_H__
 #include <algorithm>
+#include <cstdlib>
 #include "Logging.h"
 #include "UtilAll.h"
 #include "dataBlock.h"
 #include "json/json.h"
 
 namespace rocketmq {
+
 //<!***************************************************************************
 struct QueueData {
-  string brokerName;
-  int readQueueNums;
-  int writeQueueNums;
-  int perm;
+    std::string brokerName;
+    int readQueueNums;
+    int writeQueueNums;
+    int perm;
 
-  bool operator<(const QueueData& other) const {
-    return brokerName < other.brokerName;
-  }
+    bool operator<(const QueueData &other) const { return brokerName < other.brokerName; }
 
-  bool operator==(const QueueData& other) const {
-    if (brokerName == other.brokerName &&
-        readQueueNums == other.readQueueNums &&
-        writeQueueNums == other.writeQueueNums && perm == other.perm) {
-      return true;
+    bool operator==(const QueueData &other) const {
+        return brokerName == other.brokerName && readQueueNums == other.readQueueNums &&
+               writeQueueNums == other.writeQueueNums && perm == other.perm;
     }
-    return false;
-  }
 };
 
 //<!***************************************************************************
 struct BrokerData {
-  string brokerName;
-  map<int, string> brokerAddrs;  //<!0:master,1,2.. slave
+    std::string brokerName;
+    std::map<int, string> brokerAddrs;  //<!0:master,1,2.. slave
 
-  bool operator<(const BrokerData& other) const {
-    return brokerName < other.brokerName;
-  }
+    bool operator<(const BrokerData &other) const { return brokerName < other.brokerName; }
 
-  bool operator==(const BrokerData& other) const {
-    if (brokerName == other.brokerName && brokerAddrs == other.brokerAddrs) {
-      return true;
+    bool operator==(const BrokerData &other) const {
+        return brokerName == other.brokerName && brokerAddrs == other.brokerAddrs;
     }
-    return false;
-  }
 };
 
 //<!************************************************************************/
 class TopicRouteData {
- public:
-  virtual ~TopicRouteData() {
-    m_brokerDatas.clear();
-    m_queueDatas.clear();
-  }
-
-  static TopicRouteData* Decode(const MemoryBlock* mem) {
-    //<!see doc/TopicRouteData.json;
-    const char* const pData = static_cast<const char*>(mem->getData());
-    string data(pData, mem->getSize());
-    
-    Json::Value root;
-    Json::CharReaderBuilder charReaderBuilder;
-    charReaderBuilder.settings_["allowNumericKeys"] = true;
-    unique_ptr<Json::CharReader> pCharReaderPtr(charReaderBuilder.newCharReader());
-    const char* begin = pData;
-    const char* end = pData + mem->getSize(); 
-    string errs;
-    if (!pCharReaderPtr->parse(begin, end, &root, &errs)) {
-      LOG_ERROR("parse json error:%s, value isArray:%d, isObject:%d", errs.c_str(), root.isArray(), root.isObject());
-      return NULL;
+   public:
+    virtual ~TopicRouteData() {
+        m_brokerDatas.clear();
+        m_queueDatas.clear();
     }
 
-    TopicRouteData* trd = new TopicRouteData();
-    trd->setOrderTopicConf(root["orderTopicConf"].asString());
+    static TopicRouteData *Decode(const MemoryBlock *mem) {
+        //<!see doc/TopicRouteData.json;
+        const char *const pData = static_cast<const char *>(mem->getData());
+        string data(pData, mem->getSize());
 
-    Json::Value qds = root["queueDatas"];
-    for (unsigned int i = 0; i < qds.size(); i++) {
-      QueueData d;
-      Json::Value qd = qds[i];
-      d.brokerName = qd["brokerName"].asString();
-      d.readQueueNums = qd["readQueueNums"].asInt();
-      d.writeQueueNums = qd["writeQueueNums"].asInt();
-      d.perm = qd["perm"].asInt();
+        Json::CharReaderBuilder charReaderBuilder;
+        charReaderBuilder.settings_["allowNumericKeys"] = true;
+        unique_ptr<Json::CharReader> pCharReaderPtr(charReaderBuilder.newCharReader());
 
-      trd->getQueueDatas().push_back(d);
+        const char *begin = pData;
+        const char *end = pData + mem->getSize();
+        Json::Value root;
+        string errs;
+
+        if (!pCharReaderPtr->parse(begin, end, &root, &errs)) {
+            LOG_ERROR("parse json error:%s, value isArray:%d, isObject:%d", errs.c_str(), root.isArray(),
+                      root.isObject());
+            return nullptr;
+        }
+
+        auto *trd = new TopicRouteData();
+        trd->setOrderTopicConf(root["orderTopicConf"].asString());
+
+        Json::Value qds = root["queueDatas"];
+        for (auto qd : qds) {
+            QueueData d;
+            d.brokerName = qd["brokerName"].asString();
+            d.readQueueNums = qd["readQueueNums"].asInt();
+            d.writeQueueNums = qd["writeQueueNums"].asInt();
+            d.perm = qd["perm"].asInt();
+            trd->getQueueDatas().push_back(d);
+        }
+        sort(trd->getQueueDatas().begin(), trd->getQueueDatas().end());
+
+        Json::Value bds = root["brokerDatas"];
+        for (auto bd : bds) {
+            BrokerData d;
+            d.brokerName = bd["brokerName"].asString();
+            LOG_DEBUG("brokerName:%s", d.brokerName.c_str());
+            Json::Value bas = bd["brokerAddrs"];
+            Json::Value::Members mbs = bas.getMemberNames();
+            for (const auto &key : mbs) {
+                int id = atoi(key.c_str());
+                string addr = bas[key].asString();
+                d.brokerAddrs[id] = addr;
+                LOG_DEBUG("brokerId:%d, brokerAddr:%s", id, addr.c_str());
+            }
+            trd->getBrokerDatas().push_back(d);
+        }
+        sort(trd->getBrokerDatas().begin(), trd->getBrokerDatas().end());
+
+        return trd;
     }
 
-    sort(trd->getQueueDatas().begin(), trd->getQueueDatas().end());
-
-    Json::Value bds = root["brokerDatas"];
-    for (unsigned int i = 0; i < bds.size(); i++) {
-      BrokerData d;
-      Json::Value bd = bds[i];
-      d.brokerName = bd["brokerName"].asString();
-
-      LOG_DEBUG("brokerName:%s", d.brokerName.c_str());
-
-      Json::Value bas = bd["brokerAddrs"];
-      Json::Value::Members mbs = bas.getMemberNames();
-      for (size_t i = 0; i < mbs.size(); i++) {
-        string key = mbs.at(i);
-        LOG_DEBUG("brokerid:%s,brokerAddr:%s", key.c_str(),
-                  bas[key].asString().c_str());
-        d.brokerAddrs[atoi(key.c_str())] = bas[key].asString();
-      }
-
-      trd->getBrokerDatas().push_back(d);
+    /**
+     * Selects a (preferably master) broker address from the registered list.
+     * If the master's address cannot be found, a slave broker address is selected in a random manner.
+     *
+     * @return Broker address.
+     */
+    std::string selectBrokerAddr() {
+        int bdSize = m_brokerDatas.size();
+        if (bdSize > 0) {
+            int bdIndex = std::rand() % bdSize;
+            auto bd = m_brokerDatas[bdIndex];
+            auto iter = bd.brokerAddrs.find(MASTER_ID);
+            if (iter == bd.brokerAddrs.end()) {
+                int baSize = bd.brokerAddrs.size();
+                int baIndex = std::rand() % baSize;
+                iter = bd.brokerAddrs.begin();
+                for (; baIndex > 0; baIndex--) {
+                    iter++;
+                }
+            }
+            return iter->second;
+        }
+        return "";
     }
 
-    sort(trd->getBrokerDatas().begin(), trd->getBrokerDatas().end());
+    std::vector<QueueData> &getQueueDatas() { return m_queueDatas; }
 
-    return trd;
-  }
+    std::vector<BrokerData> &getBrokerDatas() { return m_brokerDatas; }
 
-  string selectBrokerAddr() {
-    vector<BrokerData>::iterator it = m_brokerDatas.begin();
-    for (; it != m_brokerDatas.end(); ++it) {
-      map<int, string>::iterator it1 = (*it).brokerAddrs.find(MASTER_ID);
-      if (it1 != (*it).brokerAddrs.end()) {
-        return it1->second;
-      }
-    }
-    return "";
-  }
+    const std::string &getOrderTopicConf() const { return m_orderTopicConf; }
 
+    void setOrderTopicConf(const string &orderTopicConf) { m_orderTopicConf = orderTopicConf; }
 
-  vector<QueueData>& getQueueDatas() { return m_queueDatas; }
-
-  vector<BrokerData>& getBrokerDatas() { return m_brokerDatas; }
-
-  const string& getOrderTopicConf() const { return m_orderTopicConf; }
-
-  void setOrderTopicConf(const string& orderTopicConf) {
-    m_orderTopicConf = orderTopicConf;
-  }
-
-  bool operator==(const TopicRouteData& other) const {
-    if (m_brokerDatas != other.m_brokerDatas) {
-      return false;
+    bool operator==(const TopicRouteData &other) const {
+        return m_brokerDatas == other.m_brokerDatas && m_orderTopicConf == other.m_orderTopicConf &&
+               m_queueDatas == other.m_queueDatas;
     }
 
-    if (m_orderTopicConf != other.m_orderTopicConf) {
-      return false;
-    }
-
-    if (m_queueDatas != other.m_queueDatas) {
-      return false;
-    }
-    return true;
-  }
-
- public:
- private:
-  string m_orderTopicConf;
-  vector<QueueData> m_queueDatas;
-  vector<BrokerData> m_brokerDatas;
+   private:
+    std::string m_orderTopicConf;
+    std::vector<QueueData> m_queueDatas;
+    std::vector<BrokerData> m_brokerDatas;
 };
 
-}  //<!end namespace;
+}  // namespace rocketmq
 
 #endif
diff --git a/src/transport/TcpTransport.cpp b/src/transport/TcpTransport.cpp
index 2c148e7..bbebc37 100644
--- a/src/transport/TcpTransport.cpp
+++ b/src/transport/TcpTransport.cpp
@@ -64,7 +64,8 @@
   struct sockaddr_in sin;
   memset(&sin, 0, sizeof(sin));
   sin.sin_family = AF_INET;
-  sin.sin_addr.s_addr = inet_addr(hostName.c_str());
+  sin.sin_addr.s_addr = getInetAddr(hostName);
+ 
   sin.sin_port = htons(portNumber);
 
   m_eventBase = event_base_new();
@@ -129,6 +130,48 @@
   }
 }
 
+u_long TcpTransport::getInetAddr(string &hostname)
+{
+	u_long addr = inet_addr(hostname.c_str());
+
+	if (INADDR_NONE == addr) {
+		constexpr size_t length = 128;
+		struct evutil_addrinfo hints;
+		struct evutil_addrinfo *answer = NULL;
+		/* Build the hints to tell getaddrinfo how to act. */
+		memset(&hints, 0, sizeof(hints));
+		hints.ai_family = AF_UNSPEC; /* v4 or v6 is fine. */
+		//Look up the hostname.
+		int err = evutil_getaddrinfo(hostname.c_str(), NULL, &hints, &answer);
+		if (err != 0) {
+			string info = "Failed to resolve  host name(" + hostname + "): " + evutil_gai_strerror(err);
+			THROW_MQEXCEPTION(MQClientException, info, -1);
+		}
+
+		struct evutil_addrinfo *addressInfo;
+		for (addressInfo = answer; addressInfo; addressInfo = addressInfo->ai_next) {
+			char buf[length];
+			const char *address = NULL;
+			if (addressInfo->ai_family == AF_INET) {
+				struct sockaddr_in *sin = (struct sockaddr_in*)addressInfo->ai_addr;
+				address = evutil_inet_ntop(AF_INET, &sin->sin_addr, buf, length);
+			}
+			else if (addressInfo->ai_family == AF_INET6) {
+				struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)addressInfo->ai_addr;
+				address = evutil_inet_ntop(AF_INET6, &sin6->sin6_addr, buf, length);
+			}
+			if (address) {
+				addr = inet_addr(address);
+				if (addr != INADDR_NONE) {
+					break;
+				}
+			}
+		}
+	}
+
+	return addr;
+}
+
 void TcpTransport::disconnect(const string &addr) {
   boost::lock_guard<boost::mutex> lock(m_socketLock);
   if (getTcpConnectStatus() != e_connectInit) {
diff --git a/src/transport/TcpTransport.h b/src/transport/TcpTransport.h
index 544e14a..fa4da85 100755
--- a/src/transport/TcpTransport.h
+++ b/src/transport/TcpTransport.h
@@ -68,6 +68,7 @@
   void freeBufferEvent();
   void exitBaseDispatch();
   void setTcpConnectEvent(tcpConnectStatus connectStatus);
+  u_long getInetAddr(std::string &hostname);
 
  private:
   uint64_t m_startTime;
diff --git a/test/src/protocol/KVTableTest.cpp b/test/src/protocol/KVTableTest.cpp
new file mode 100644
index 0000000..312d35c
--- /dev/null
+++ b/test/src/protocol/KVTableTest.cpp
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <map>
+#include <string>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "KVTable.h"
+
+using std::map;
+using std::string;
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::KVTable;
+
+TEST(KVTable, init) {
+    KVTable table;
+
+    EXPECT_EQ(table.getTable().size(), 0);
+
+    map<string, string> maps;
+    maps["string"] = "string";
+    table.setTable(maps);
+    EXPECT_EQ(table.getTable().size(), 1);
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "KVTable.*";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/protocol/LockBatchBodyTest.cpp b/test/src/protocol/LockBatchBodyTest.cpp
new file mode 100644
index 0000000..fec3b27
--- /dev/null
+++ b/test/src/protocol/LockBatchBodyTest.cpp
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "vector"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "LockBatchBody.h"
+#include "MQMessageQueue.h"
+#include "dataBlock.h"
+
+using std::vector;
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::LockBatchRequestBody;
+using rocketmq::LockBatchResponseBody;
+using rocketmq::MemoryBlock;
+using rocketmq::MQMessageQueue;
+using rocketmq::UnlockBatchRequestBody;
+
+TEST(lockBatchBody, LockBatchRequestBody) {
+    LockBatchRequestBody lockBatchRequestBody;
+
+    lockBatchRequestBody.setClientId("testClientId");
+    EXPECT_EQ(lockBatchRequestBody.getClientId(), "testClientId");
+
+    lockBatchRequestBody.setConsumerGroup("testGroup");
+    EXPECT_EQ(lockBatchRequestBody.getConsumerGroup(), "testGroup");
+
+    vector<MQMessageQueue> vectorMessageQueue;
+    vectorMessageQueue.push_back(MQMessageQueue());
+    vectorMessageQueue.push_back(MQMessageQueue());
+
+    lockBatchRequestBody.setMqSet(vectorMessageQueue);
+    EXPECT_EQ(lockBatchRequestBody.getMqSet(), vectorMessageQueue);
+
+    Json::Value outJson = lockBatchRequestBody.toJson(MQMessageQueue("topicTest", "testBroker", 10));
+    EXPECT_EQ(outJson["topic"], "topicTest");
+    EXPECT_EQ(outJson["brokerName"], "testBroker");
+    EXPECT_EQ(outJson["queueId"], 10);
+
+    string outData;
+    lockBatchRequestBody.Encode(outData);
+
+    Json::Value root;
+    Json::Reader reader;
+    reader.parse(outData, root);
+    EXPECT_EQ(root["clientId"], "testClientId");
+    EXPECT_EQ(root["consumerGroup"], "testGroup");
+}
+
+TEST(lockBatchBody, UnlockBatchRequestBody) {}
+
+TEST(lockBatchBody, LockBatchResponseBody) {
+    Json::Value root;
+    Json::Value mqs;
+
+    Json::Value mq;
+    mq["topic"] = "testTopic";
+    mq["brokerName"] = "testBroker";
+    mq["queueId"] = 1;
+    mqs[0] = mq;
+    root["lockOKMQSet"] = mqs;
+
+    Json::FastWriter fastwrite;
+    string outData = fastwrite.write(root);
+
+    MemoryBlock *mem = new MemoryBlock(outData.c_str(), outData.size());
+
+    LockBatchResponseBody lockBatchResponseBody;
+
+    vector<MQMessageQueue> messageQueues;
+    LockBatchResponseBody::Decode(mem, messageQueues);
+
+    MQMessageQueue messageQueue("testTopic", "testBroker", 1);
+    EXPECT_EQ(messageQueue, messageQueues[0]);
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "lockBatchBody.*";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/protocol/MessageQueueTest.cpp b/test/src/protocol/MessageQueueTest.cpp
new file mode 100644
index 0000000..68d137e
--- /dev/null
+++ b/test/src/protocol/MessageQueueTest.cpp
@@ -0,0 +1,89 @@
+/*"
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "MessageQueue.h"
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::MessageQueue;
+
+TEST(messageExt, init) {
+    MessageQueue messageQueue;
+    EXPECT_EQ(messageQueue.getQueueId(), -1);
+
+    MessageQueue twoMessageQueue("testTopic", "testBroker", 1);
+    EXPECT_EQ(twoMessageQueue.getQueueId(), 1);
+    EXPECT_EQ(twoMessageQueue.getTopic(), "testTopic");
+    EXPECT_EQ(twoMessageQueue.getBrokerName(), "testBroker");
+
+    MessageQueue threeMessageQueue(twoMessageQueue);
+    EXPECT_EQ(threeMessageQueue.getQueueId(), 1);
+    EXPECT_EQ(threeMessageQueue.getTopic(), "testTopic");
+    EXPECT_EQ(threeMessageQueue.getBrokerName(), "testBroker");
+
+    Json::Value outJson = twoMessageQueue.toJson();
+    EXPECT_EQ(outJson["queueId"], 1);
+    EXPECT_EQ(outJson["topic"], "testTopic");
+    EXPECT_EQ(outJson["brokerName"], "testBroker");
+
+    MessageQueue fiveMessageQueue = threeMessageQueue;
+    EXPECT_EQ(fiveMessageQueue.getQueueId(), 1);
+    EXPECT_EQ(fiveMessageQueue.getTopic(), "testTopic");
+    EXPECT_EQ(fiveMessageQueue.getBrokerName(), "testBroker");
+}
+
+TEST(messageExt, info) {
+    MessageQueue messageQueue;
+
+    messageQueue.setQueueId(11);
+    EXPECT_EQ(messageQueue.getQueueId(), 11);
+
+    messageQueue.setTopic("testTopic");
+    EXPECT_EQ(messageQueue.getTopic(), "testTopic");
+
+    messageQueue.setBrokerName("testBroker");
+    EXPECT_EQ(messageQueue.getBrokerName(), "testBroker");
+}
+
+TEST(messageExt, operators) {
+    MessageQueue messageQueue;
+    EXPECT_TRUE(messageQueue == messageQueue);
+
+    MessageQueue twoMessageQueue;
+    EXPECT_TRUE(messageQueue == twoMessageQueue);
+
+    twoMessageQueue.setTopic("testTopic");
+    EXPECT_FALSE(messageQueue == twoMessageQueue);
+
+    messageQueue.setQueueId(11);
+    EXPECT_FALSE(messageQueue == twoMessageQueue);
+
+    messageQueue.setBrokerName("testBroker");
+    EXPECT_FALSE(messageQueue == twoMessageQueue);
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "messageExt.*";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/protocol/ProcessQueueInfoTest.cpp b/test/src/protocol/ProcessQueueInfoTest.cpp
new file mode 100644
index 0000000..9f00d51
--- /dev/null
+++ b/test/src/protocol/ProcessQueueInfoTest.cpp
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "MQMessageExt.h"
+#include "ProcessQueueInfo.h"
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::MQMessageExt;
+using rocketmq::ProcessQueueInfo;
+
+TEST(processQueueInfo, init) {
+    ProcessQueueInfo processQueueInfo;
+    EXPECT_EQ(processQueueInfo.commitOffset, 0);
+    EXPECT_EQ(processQueueInfo.cachedMsgMinOffset, 0);
+    EXPECT_EQ(processQueueInfo.cachedMsgMaxOffset, 0);
+    EXPECT_EQ(processQueueInfo.cachedMsgCount, 0);
+    EXPECT_EQ(processQueueInfo.transactionMsgMinOffset, 0);
+    EXPECT_EQ(processQueueInfo.transactionMsgMaxOffset, 0);
+    EXPECT_EQ(processQueueInfo.transactionMsgCount, 0);
+    EXPECT_EQ(processQueueInfo.locked, false);
+    EXPECT_EQ(processQueueInfo.tryUnlockTimes, 0);
+    EXPECT_EQ(processQueueInfo.lastLockTimestamp, 123);
+    EXPECT_EQ(processQueueInfo.droped, false);
+    EXPECT_EQ(processQueueInfo.lastPullTimestamp, 0);
+    EXPECT_EQ(processQueueInfo.lastConsumeTimestamp, 0);
+
+    processQueueInfo.setLocked(true);
+    EXPECT_EQ(processQueueInfo.isLocked(), true);
+
+    processQueueInfo.setDroped(true);
+    EXPECT_EQ(processQueueInfo.isDroped(), true);
+
+    processQueueInfo.setCommitOffset(456);
+    EXPECT_EQ(processQueueInfo.getCommitOffset(), 456);
+
+    Json::Value outJson = processQueueInfo.toJson();
+
+    EXPECT_EQ(outJson["commitOffset"], "456");
+    EXPECT_EQ(outJson["cachedMsgMinOffset"], "0");
+    EXPECT_EQ(outJson["cachedMsgMaxOffset"], "0");
+    EXPECT_EQ(outJson["cachedMsgCount"].asInt(), 0);
+    EXPECT_EQ(outJson["transactionMsgMinOffset"], "0");
+    EXPECT_EQ(outJson["transactionMsgMaxOffset"], "0");
+    EXPECT_EQ(outJson["transactionMsgCount"].asInt(), 0);
+    EXPECT_EQ(outJson["locked"].asBool(), true);
+    EXPECT_EQ(outJson["tryUnlockTimes"].asInt(), 0);
+    EXPECT_EQ(outJson["lastLockTimestamp"], "123");
+    EXPECT_EQ(outJson["droped"].asBool(), true);
+    EXPECT_EQ(outJson["lastPullTimestamp"], "0");
+    EXPECT_EQ(outJson["lastConsumeTimestamp"], "0");
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "processQueueInfo.init";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/protocol/RemotingCommandTest.cpp b/test/src/protocol/RemotingCommandTest.cpp
new file mode 100644
index 0000000..1da4c14
--- /dev/null
+++ b/test/src/protocol/RemotingCommandTest.cpp
@@ -0,0 +1,285 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <iostream>
+#include <memory>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "CommandHeader.h"
+#include "MQProtos.h"
+#include "MQVersion.h"
+#include "MemoryOutputStream.h"
+#include "RemotingCommand.h"
+#include "dataBlock.h"
+
+using std::shared_ptr;
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::CommandHeader;
+using rocketmq::GetConsumerRunningInfoRequestHeader;
+using rocketmq::GetEarliestMsgStoretimeResponseHeader;
+using rocketmq::GetMaxOffsetResponseHeader;
+using rocketmq::GetMinOffsetResponseHeader;
+using rocketmq::GetRouteInfoRequestHeader;
+using rocketmq::MemoryBlock;
+using rocketmq::MemoryOutputStream;
+using rocketmq::MQRequestCode;
+using rocketmq::MQVersion;
+using rocketmq::NotifyConsumerIdsChangedRequestHeader;
+using rocketmq::PullMessageResponseHeader;
+using rocketmq::QueryConsumerOffsetResponseHeader;
+using rocketmq::RemotingCommand;
+using rocketmq::ResetOffsetRequestHeader;
+using rocketmq::SearchOffsetResponseHeader;
+using rocketmq::SendMessageResponseHeader;
+
+TEST(remotingCommand, init) {
+    RemotingCommand remotingCommand;
+    EXPECT_EQ(remotingCommand.getCode(), 0);
+    EXPECT_EQ(remotingCommand.getOpaque(), 0);
+    EXPECT_EQ(remotingCommand.getRemark(), "");
+    EXPECT_EQ(remotingCommand.getVersion(), 0);
+    //  EXPECT_EQ(remotingCommand.getFlag() , 0);
+    EXPECT_EQ(remotingCommand.getMsgBody(), "");
+    EXPECT_TRUE(remotingCommand.getCommandHeader() == nullptr);
+
+    RemotingCommand twoRemotingCommand(13);
+    EXPECT_EQ(twoRemotingCommand.getCode(), 13);
+    EXPECT_EQ(twoRemotingCommand.getOpaque(), 0);
+    EXPECT_EQ(twoRemotingCommand.getRemark(), "");
+    EXPECT_EQ(twoRemotingCommand.getVersion(), MQVersion::s_CurrentVersion);
+    // EXPECT_EQ(twoRemotingCommand.getFlag() , 0);
+    EXPECT_EQ(twoRemotingCommand.getMsgBody(), "");
+    EXPECT_TRUE(twoRemotingCommand.getCommandHeader() == nullptr);
+
+    RemotingCommand threeRemotingCommand(13, new GetRouteInfoRequestHeader("topic"));
+    EXPECT_FALSE(threeRemotingCommand.getCommandHeader() == nullptr);
+
+    RemotingCommand frouRemotingCommand(13, "CPP", MQVersion::s_CurrentVersion, 12, 3, "remark",
+                                        new GetRouteInfoRequestHeader("topic"));
+    EXPECT_EQ(frouRemotingCommand.getCode(), 13);
+    EXPECT_EQ(frouRemotingCommand.getOpaque(), 12);
+    EXPECT_EQ(frouRemotingCommand.getRemark(), "remark");
+    EXPECT_EQ(frouRemotingCommand.getVersion(), MQVersion::s_CurrentVersion);
+    EXPECT_EQ(frouRemotingCommand.getFlag(), 3);
+    EXPECT_EQ(frouRemotingCommand.getMsgBody(), "");
+    EXPECT_FALSE(frouRemotingCommand.getCommandHeader() == nullptr);
+
+    RemotingCommand sixRemotingCommand(frouRemotingCommand);
+    EXPECT_EQ(sixRemotingCommand.getCode(), 13);
+    EXPECT_EQ(sixRemotingCommand.getOpaque(), 12);
+    EXPECT_EQ(sixRemotingCommand.getRemark(), "remark");
+    EXPECT_EQ(sixRemotingCommand.getVersion(), MQVersion::s_CurrentVersion);
+    EXPECT_EQ(sixRemotingCommand.getFlag(), 3);
+    EXPECT_EQ(sixRemotingCommand.getMsgBody(), "");
+    EXPECT_TRUE(sixRemotingCommand.getCommandHeader() == nullptr);
+
+    RemotingCommand *sevenRemotingCommand = new RemotingCommand();
+    EXPECT_EQ(sevenRemotingCommand->getCode(), 0);
+    EXPECT_EQ(sevenRemotingCommand->getOpaque(), 0);
+    EXPECT_EQ(sevenRemotingCommand->getRemark(), "");
+    EXPECT_EQ(sevenRemotingCommand->getVersion(), 0);
+    EXPECT_EQ(sevenRemotingCommand->getFlag(), 0);
+    EXPECT_EQ(sevenRemotingCommand->getMsgBody(), "");
+    EXPECT_TRUE(sevenRemotingCommand->getCommandHeader() == nullptr);
+
+    RemotingCommand *egthRemotingCommand = sevenRemotingCommand;
+    EXPECT_EQ(egthRemotingCommand->getCode(), 0);
+    EXPECT_EQ(egthRemotingCommand->getOpaque(), 0);
+    EXPECT_EQ(egthRemotingCommand->getRemark(), "");
+    EXPECT_EQ(egthRemotingCommand->getVersion(), 0);
+    EXPECT_EQ(egthRemotingCommand->getFlag(), 0);
+    EXPECT_EQ(egthRemotingCommand->getMsgBody(), "");
+    EXPECT_TRUE(egthRemotingCommand->getCommandHeader() == nullptr);
+
+    sevenRemotingCommand = &sixRemotingCommand;
+    EXPECT_EQ(sevenRemotingCommand->getCode(), 13);
+    EXPECT_EQ(sevenRemotingCommand->getOpaque(), 12);
+    EXPECT_EQ(sevenRemotingCommand->getRemark(), "remark");
+    EXPECT_EQ(sevenRemotingCommand->getVersion(), MQVersion::s_CurrentVersion);
+    EXPECT_EQ(sevenRemotingCommand->getFlag(), 3);
+    EXPECT_EQ(sevenRemotingCommand->getMsgBody(), "");
+    EXPECT_TRUE(sevenRemotingCommand->getCommandHeader() == nullptr);
+
+    // Assign
+    delete egthRemotingCommand;
+}
+
+TEST(remotingCommand, info) {
+    RemotingCommand remotingCommand;
+
+    remotingCommand.setCode(13);
+    EXPECT_EQ(remotingCommand.getCode(), 13);
+
+    remotingCommand.setOpaque(12);
+    EXPECT_EQ(remotingCommand.getOpaque(), 12);
+
+    remotingCommand.setRemark("123");
+    EXPECT_EQ(remotingCommand.getRemark(), "123");
+
+    remotingCommand.setMsgBody("msgBody");
+    EXPECT_EQ(remotingCommand.getMsgBody(), "msgBody");
+
+    remotingCommand.addExtField("key", "value");
+}
+
+TEST(remotingCommand, flag) {
+    RemotingCommand remotingCommand(13, "CPP", MQVersion::s_CurrentVersion, 12, 0, "remark",
+                                    new GetRouteInfoRequestHeader("topic"));
+    ;
+    EXPECT_EQ(remotingCommand.getFlag(), 0);
+
+    remotingCommand.markResponseType();
+    int bits = 1 << 0;
+    int flag = 0;
+    flag |= bits;
+    EXPECT_EQ(remotingCommand.getFlag(), flag);
+    EXPECT_TRUE(remotingCommand.isResponseType());
+
+    bits = 1 << 1;
+    flag |= bits;
+    remotingCommand.markOnewayRPC();
+    EXPECT_EQ(remotingCommand.getFlag(), flag);
+    EXPECT_TRUE(remotingCommand.isOnewayRPC());
+}
+
+TEST(remotingCommand, encodeAndDecode) {
+    RemotingCommand remotingCommand(13, "CPP", MQVersion::s_CurrentVersion, 12, 3, "remark", NULL);
+    remotingCommand.SetBody("123123", 6);
+    remotingCommand.Encode();
+    // no delete
+    const MemoryBlock *head = remotingCommand.GetHead();
+    const MemoryBlock *body = remotingCommand.GetBody();
+
+    unique_ptr<MemoryOutputStream> result(new MemoryOutputStream(1024));
+    result->write(head->getData() + 4, head->getSize() - 4);
+    result->write(body->getData(), body->getSize());
+
+    shared_ptr<RemotingCommand> decodeRemtingCommand(RemotingCommand::Decode(result->getMemoryBlock()));
+    EXPECT_EQ(remotingCommand.getCode(), decodeRemtingCommand->getCode());
+    EXPECT_EQ(remotingCommand.getOpaque(), decodeRemtingCommand->getOpaque());
+    EXPECT_EQ(remotingCommand.getRemark(), decodeRemtingCommand->getRemark());
+    EXPECT_EQ(remotingCommand.getVersion(), decodeRemtingCommand->getVersion());
+    EXPECT_EQ(remotingCommand.getFlag(), decodeRemtingCommand->getFlag());
+    EXPECT_TRUE(decodeRemtingCommand->getCommandHeader() == NULL);
+
+    // ~RemotingCommand delete
+    GetConsumerRunningInfoRequestHeader *requestHeader = new GetConsumerRunningInfoRequestHeader();
+    requestHeader->setClientId("client");
+    requestHeader->setConsumerGroup("consumerGroup");
+    requestHeader->setJstackEnable(false);
+
+    RemotingCommand encodeRemotingCommand(307, "CPP", MQVersion::s_CurrentVersion, 12, 3, "remark", requestHeader);
+    encodeRemotingCommand.SetBody("123123", 6);
+    encodeRemotingCommand.Encode();
+
+    // no delete
+    const MemoryBlock *phead = encodeRemotingCommand.GetHead();
+    const MemoryBlock *pbody = encodeRemotingCommand.GetBody();
+
+    unique_ptr<MemoryOutputStream> results(new MemoryOutputStream(1024));
+    results->write(phead->getData() + 4, phead->getSize() - 4);
+    results->write(pbody->getData(), pbody->getSize());
+
+    shared_ptr<RemotingCommand> decodeRemtingCommandTwo(RemotingCommand::Decode(results->getMemoryBlock()));
+
+    decodeRemtingCommandTwo->SetExtHeader(encodeRemotingCommand.getCode());
+    GetConsumerRunningInfoRequestHeader *header =
+        reinterpret_cast<GetConsumerRunningInfoRequestHeader *>(decodeRemtingCommandTwo->getCommandHeader());
+    EXPECT_EQ(requestHeader->getClientId(), header->getClientId());
+    EXPECT_EQ(requestHeader->getConsumerGroup(), header->getConsumerGroup());
+}
+
+TEST(remotingCommand, SetExtHeader) {
+    shared_ptr<RemotingCommand> remotingCommand(new RemotingCommand());
+
+    remotingCommand->SetExtHeader(-1);
+    EXPECT_TRUE(remotingCommand->getCommandHeader() == NULL);
+
+    Json::Value object;
+    Json::Value extFields;
+    extFields["id"] = 1;
+    object["extFields"] = extFields;
+    remotingCommand->setParsedJson(object);
+
+    remotingCommand->SetExtHeader(MQRequestCode::SEND_MESSAGE);
+    SendMessageResponseHeader *sendMessageResponseHeader =
+        reinterpret_cast<SendMessageResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(sendMessageResponseHeader->msgId, "");
+
+    remotingCommand->SetExtHeader(MQRequestCode::PULL_MESSAGE);
+    PullMessageResponseHeader *pullMessageResponseHeader =
+        reinterpret_cast<PullMessageResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(pullMessageResponseHeader->suggestWhichBrokerId, 0);
+
+    remotingCommand->SetExtHeader(MQRequestCode::GET_MIN_OFFSET);
+    GetMinOffsetResponseHeader *getMinOffsetResponseHeader =
+        reinterpret_cast<GetMinOffsetResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(getMinOffsetResponseHeader->offset, 0);
+
+    remotingCommand->SetExtHeader(MQRequestCode::GET_MAX_OFFSET);
+    GetMaxOffsetResponseHeader *getMaxOffsetResponseHeader =
+        reinterpret_cast<GetMaxOffsetResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(getMaxOffsetResponseHeader->offset, 0);
+
+    remotingCommand->SetExtHeader(MQRequestCode::SEARCH_OFFSET_BY_TIMESTAMP);
+    SearchOffsetResponseHeader *searchOffsetResponseHeader =
+        reinterpret_cast<SearchOffsetResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(searchOffsetResponseHeader->offset, 0);
+
+    remotingCommand->SetExtHeader(MQRequestCode::GET_EARLIEST_MSG_STORETIME);
+    GetEarliestMsgStoretimeResponseHeader *getEarliestMsgStoretimeResponseHeader =
+        reinterpret_cast<GetEarliestMsgStoretimeResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(getEarliestMsgStoretimeResponseHeader->timestamp, 0);
+
+    remotingCommand->SetExtHeader(MQRequestCode::QUERY_CONSUMER_OFFSET);
+    QueryConsumerOffsetResponseHeader *queryConsumerOffsetResponseHeader =
+        reinterpret_cast<QueryConsumerOffsetResponseHeader *>(remotingCommand->getCommandHeader());
+    EXPECT_EQ(queryConsumerOffsetResponseHeader->offset, 0);
+
+    extFields["isForce"] = "true";
+    object["extFields"] = extFields;
+    remotingCommand->setParsedJson(object);
+    remotingCommand->SetExtHeader(MQRequestCode::RESET_CONSUMER_CLIENT_OFFSET);
+    ResetOffsetRequestHeader *resetOffsetRequestHeader =
+        reinterpret_cast<ResetOffsetRequestHeader *>(remotingCommand->getCommandHeader());
+    resetOffsetRequestHeader->setGroup("group");
+
+    remotingCommand->SetExtHeader(MQRequestCode::GET_CONSUMER_RUNNING_INFO);
+    GetConsumerRunningInfoRequestHeader *getConsumerRunningInfoRequestHeader =
+        reinterpret_cast<GetConsumerRunningInfoRequestHeader *>(remotingCommand->getCommandHeader());
+    getConsumerRunningInfoRequestHeader->setClientId("id");
+
+    remotingCommand->SetExtHeader(MQRequestCode::NOTIFY_CONSUMER_IDS_CHANGED);
+    NotifyConsumerIdsChangedRequestHeader *notifyConsumerIdsChangedRequestHeader =
+        reinterpret_cast<NotifyConsumerIdsChangedRequestHeader *>(remotingCommand->getCommandHeader());
+    notifyConsumerIdsChangedRequestHeader->setGroup("group");
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "remotingCommand.*";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/protocol/TopicRouteDataTest.cpp b/test/src/protocol/TopicRouteDataTest.cpp
new file mode 100644
index 0000000..8ddba9f
--- /dev/null
+++ b/test/src/protocol/TopicRouteDataTest.cpp
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "TopicRouteData.h"
+#include "dataBlock.h"
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::BrokerData;
+using rocketmq::MemoryBlock;
+using rocketmq::QueueData;
+using rocketmq::TopicRouteData;
+
+TEST(topicRouteData, topicRouteData) {
+    Json::Value root;
+    root["orderTopicConf"] = "orderTopicConf";
+
+    Json::Value queueDatas;
+    Json::Value queueData;
+
+    queueData["brokerName"] = "brokerTest";
+    queueData["readQueueNums"] = 8;
+    queueData["writeQueueNums"] = 8;
+    queueData["perm"] = 7;
+    queueDatas[0] = queueData;
+
+    root["queueDatas"] = queueDatas;
+
+    Json::Value brokerDatas;
+    Json::Value brokerData;
+    brokerData["brokerName"] = "testBroker";
+
+    Json::Value brokerAddrs;
+    brokerAddrs["0"] = "127.0.0.1:10091";
+    brokerAddrs["1"] = "127.0.0.2:10092";
+    brokerData["brokerAddrs"] = brokerAddrs;
+
+    brokerDatas[0] = brokerData;
+
+    root["brokerDatas"] = brokerDatas;
+    string out = root.toStyledString();
+
+    MemoryBlock *block = new MemoryBlock(out.c_str(), out.size());
+    TopicRouteData *topicRouteData = TopicRouteData::Decode(block);
+    EXPECT_EQ(root["orderTopicConf"], topicRouteData->getOrderTopicConf());
+
+    BrokerData broker;
+    broker.brokerName = "testBroker";
+    broker.brokerAddrs[0] = "127.0.0.1:10091";
+    broker.brokerAddrs[1] = "127.0.0.2:10092";
+
+    vector<BrokerData> brokerDataSt = topicRouteData->getBrokerDatas();
+    EXPECT_EQ(broker, brokerDataSt[0]);
+
+    QueueData queue;
+    queue.brokerName = "brokerTest";
+    queue.readQueueNums = 8;
+    queue.writeQueueNums = 8;
+    queue.perm = 7;
+    vector<QueueData> queueDataSt = topicRouteData->getQueueDatas();
+    EXPECT_EQ(queue, queueDataSt[0]);
+
+    EXPECT_EQ(topicRouteData->selectBrokerAddr(), "127.0.0.1:10091");
+
+    delete block;
+    delete topicRouteData;
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "topicRouteData.topicRouteData";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/transport/ClientRemotingProcessorTest.cpp b/test/src/transport/ClientRemotingProcessorTest.cpp
new file mode 100644
index 0000000..80348b0
--- /dev/null
+++ b/test/src/transport/ClientRemotingProcessorTest.cpp
@@ -0,0 +1,235 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <memory>
+#include "map"
+#include "string.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "json/value.h"
+#include "json/writer.h"
+
+#include "ClientRPCHook.h"
+#include "ClientRemotingProcessor.h"
+#include "ConsumerRunningInfo.h"
+#include "MQClientFactory.h"
+#include "MQMessageQueue.h"
+#include "MQProtos.h"
+#include "RemotingCommand.h"
+#include "SessionCredentials.h"
+#include "UtilAll.h"
+#include "dataBlock.h"
+
+using std::map;
+using std::string;
+
+using ::testing::_;
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Mock;
+using testing::Return;
+using testing::SetArgReferee;
+
+using Json::FastWriter;
+using Json::Value;
+
+using rocketmq::ClientRemotingProcessor;
+using rocketmq::ClientRPCHook;
+using rocketmq::ConsumerRunningInfo;
+using rocketmq::GetConsumerRunningInfoRequestHeader;
+using rocketmq::MemoryBlock;
+using rocketmq::MQClientFactory;
+using rocketmq::MQMessageQueue;
+using rocketmq::MQRequestCode;
+using rocketmq::MQResponseCode;
+using rocketmq::NotifyConsumerIdsChangedRequestHeader;
+using rocketmq::RemotingCommand;
+using rocketmq::ResetOffsetBody;
+using rocketmq::ResetOffsetRequestHeader;
+using rocketmq::SessionCredentials;
+using rocketmq::UtilAll;
+
+class MockClientRemotingProcessor : public ClientRemotingProcessor {
+   public:
+    MockClientRemotingProcessor(MQClientFactory *factrory) : ClientRemotingProcessor(factrory) {}
+    MOCK_METHOD1(resetOffset, RemotingCommand *(RemotingCommand *request));
+    MOCK_METHOD1(getConsumerRunningInfo, RemotingCommand *(RemotingCommand *request));
+    MOCK_METHOD1(notifyConsumerIdsChanged, RemotingCommand *(RemotingCommand *request));
+};
+
+class MockMQClientFactory : public MQClientFactory {
+   public:
+    MockMQClientFactory(const string &clientID,
+                        int pullThreadNum,
+                        uint64_t tcpConnectTimeout,
+                        uint64_t tcpTransportTryLockTimeout,
+                        string unitName)
+        : MQClientFactory(clientID, pullThreadNum, tcpConnectTimeout, tcpTransportTryLockTimeout, unitName) {}
+
+    MOCK_METHOD3(resetOffset,
+                 void(const string &group, const string &topic, const map<MQMessageQueue, int64> &offsetTable));
+    MOCK_METHOD1(consumerRunningInfo, ConsumerRunningInfo *(const string &consumerGroup));
+    MOCK_METHOD2(getSessionCredentialFromConsumer,
+                 bool(const string &consumerGroup, SessionCredentials &sessionCredentials));
+    MOCK_METHOD1(doRebalanceByConsumerGroup, void(const string &consumerGroup));
+};
+
+TEST(clientRemotingProcessor, processRequest) {
+    MockMQClientFactory *factory = new MockMQClientFactory("testClientId", 4, 3000, 4000, "a");
+    ClientRemotingProcessor clientRemotingProcessor(factory);
+
+    string addr = "127.0.0.1:9876";
+    RemotingCommand *command = new RemotingCommand();
+    RemotingCommand *pResponse = new RemotingCommand(13);
+
+    pResponse->setCode(MQRequestCode::RESET_CONSUMER_CLIENT_OFFSET);
+    command->setCode(MQRequestCode::RESET_CONSUMER_CLIENT_OFFSET);
+    EXPECT_TRUE(clientRemotingProcessor.processRequest(addr, command) == nullptr);
+    EXPECT_EQ(nullptr, clientRemotingProcessor.processRequest(addr, command));
+
+    NotifyConsumerIdsChangedRequestHeader *header = new NotifyConsumerIdsChangedRequestHeader();
+    header->setGroup("testGroup");
+    RemotingCommand *twoCommand = new RemotingCommand(MQRequestCode::NOTIFY_CONSUMER_IDS_CHANGED, header);
+
+    EXPECT_EQ(NULL, clientRemotingProcessor.processRequest(addr, twoCommand));
+
+    command->setCode(MQRequestCode::GET_CONSUMER_RUNNING_INFO);
+    // EXPECT_EQ(NULL , clientRemotingProcessor.processRequest(addr, command));
+
+    command->setCode(MQRequestCode::CHECK_TRANSACTION_STATE);
+    EXPECT_TRUE(clientRemotingProcessor.processRequest(addr, command) == nullptr);
+
+    command->setCode(MQRequestCode::GET_CONSUMER_STATUS_FROM_CLIENT);
+    EXPECT_TRUE(clientRemotingProcessor.processRequest(addr, command) == nullptr);
+
+    command->setCode(MQRequestCode::CONSUME_MESSAGE_DIRECTLY);
+    EXPECT_TRUE(clientRemotingProcessor.processRequest(addr, command) == nullptr);
+
+    command->setCode(1);
+    EXPECT_TRUE(clientRemotingProcessor.processRequest(addr, command) == nullptr);
+
+    delete command;
+    delete pResponse;
+}
+
+TEST(clientRemotingProcessor, resetOffset) {
+    MockMQClientFactory *factory = new MockMQClientFactory("testClientId", 4, 3000, 4000, "a");
+    Mock::AllowLeak(factory);
+    ClientRemotingProcessor clientRemotingProcessor(factory);
+    Value root;
+    Value messageQueues;
+    Value messageQueue;
+    messageQueue["brokerName"] = "testBroker";
+    messageQueue["queueId"] = 4;
+    messageQueue["topic"] = "testTopic";
+    messageQueue["offset"] = 1024;
+
+    messageQueues.append(messageQueue);
+    root["offsetTable"] = messageQueues;
+
+    FastWriter wrtier;
+    string strData = wrtier.write(root);
+
+    ResetOffsetRequestHeader *header = new ResetOffsetRequestHeader();
+    RemotingCommand *request = new RemotingCommand(13, header);
+
+    EXPECT_CALL(*factory, resetOffset(_, _, _)).Times(1);
+    clientRemotingProcessor.resetOffset(request);
+
+    request->SetBody(strData.c_str(), strData.size() - 2);
+    clientRemotingProcessor.resetOffset(request);
+
+    request->SetBody(strData.c_str(), strData.size());
+    clientRemotingProcessor.resetOffset(request);
+
+    delete header;
+    delete request;
+}
+
+TEST(clientRemotingProcessorS, getConsumerRunningInfo) {
+    MockMQClientFactory *factory = new MockMQClientFactory("testClientId", 4, 3000, 4000, "a");
+    ConsumerRunningInfo *info = new ConsumerRunningInfo();
+    EXPECT_CALL(*factory, consumerRunningInfo(_)).Times(2).WillOnce(Return(info)).WillOnce(Return(info));
+    EXPECT_CALL(*factory, getSessionCredentialFromConsumer(_, _))
+        .Times(2);  //.WillRepeatedly(SetArgReferee<1>(sessionCredentials));
+    ClientRemotingProcessor clientRemotingProcessor(factory);
+
+    GetConsumerRunningInfoRequestHeader *header = new GetConsumerRunningInfoRequestHeader();
+    header->setConsumerGroup("testGroup");
+
+    RemotingCommand *request = new RemotingCommand(14, header);
+
+    RemotingCommand *command = clientRemotingProcessor.getConsumerRunningInfo("127.0.0.1:9876", request);
+    EXPECT_EQ(command->getCode(), MQResponseCode::SYSTEM_ERROR);
+    EXPECT_EQ(command->getRemark(), "The Consumer Group not exist in this consumer");
+    delete command;
+    delete request;
+}
+
+TEST(clientRemotingProcessor, notifyConsumerIdsChanged) {
+    MockMQClientFactory *factory = new MockMQClientFactory("testClientId", 4, 3000, 4000, "a");
+    Mock::AllowLeak(factory);
+    ClientRemotingProcessor clientRemotingProcessor(factory);
+    NotifyConsumerIdsChangedRequestHeader *header = new NotifyConsumerIdsChangedRequestHeader();
+    header->setGroup("testGroup");
+    RemotingCommand *request = new RemotingCommand(14, header);
+
+    EXPECT_CALL(*factory, doRebalanceByConsumerGroup(_)).Times(1);
+    clientRemotingProcessor.notifyConsumerIdsChanged(request);
+
+    delete request;
+}
+
+TEST(clientRemotingProcessor, resetOffsetBody) {
+    MockMQClientFactory *factory = new MockMQClientFactory("testClientId", 4, 3000, 4000, "a");
+    ClientRemotingProcessor clientRemotingProcessor(factory);
+
+    Value root;
+    Value messageQueues;
+    Value messageQueue;
+    messageQueue["brokerName"] = "testBroker";
+    messageQueue["queueId"] = 4;
+    messageQueue["topic"] = "testTopic";
+    messageQueue["offset"] = 1024;
+
+    messageQueues.append(messageQueue);
+    root["offsetTable"] = messageQueues;
+
+    FastWriter wrtier;
+    string strData = wrtier.write(root);
+
+    MemoryBlock *mem = new MemoryBlock(strData.c_str(), strData.size());
+
+    ResetOffsetBody *resetOffset = ResetOffsetBody::Decode(mem);
+
+    map<MQMessageQueue, int64> map = resetOffset->getOffsetTable();
+    MQMessageQueue mqmq("testTopic", "testBroker", 4);
+    EXPECT_EQ(map[mqmq], 1024);
+    Mock::AllowLeak(factory);
+    delete resetOffset;
+    delete mem;
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "clientRemotingProcessor.*";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/transport/ResponseFutureTest.cpp b/test/src/transport/ResponseFutureTest.cpp
new file mode 100644
index 0000000..483fced
--- /dev/null
+++ b/test/src/transport/ResponseFutureTest.cpp
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "AsyncCallback.h"
+#include "AsyncCallbackWrap.h"
+#include "MQClientAPIImpl.h"
+#include "MQMessage.h"
+#include "RemotingCommand.h"
+#include "ResponseFuture.h"
+#include "TcpRemotingClient.h"
+#include "UtilAll.h"
+
+using ::testing::_;
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+using rocketmq::AsyncCallback;
+using rocketmq::asyncCallBackStatus;
+using rocketmq::asyncCallBackType;
+using rocketmq::AsyncCallbackWrap;
+using rocketmq::MQClientAPIImpl;
+using rocketmq::MQMessage;
+using rocketmq::RemotingCommand;
+using rocketmq::ResponseFuture;
+using rocketmq::SendCallbackWrap;
+using rocketmq::TcpRemotingClient;
+using rocketmq::UtilAll;
+
+class MockAsyncCallbackWrap : public SendCallbackWrap {
+   public:
+    MockAsyncCallbackWrap(AsyncCallback *pAsyncCallback, MQClientAPIImpl *pclientAPI)
+        : SendCallbackWrap("", MQMessage(), pAsyncCallback, pclientAPI) {}
+
+    MOCK_METHOD2(operationComplete, void(ResponseFuture *, bool));
+    MOCK_METHOD0(onException, void());
+    asyncCallBackType getCallbackType() { return asyncCallBackType::sendCallbackWrap; }
+};
+
+TEST(responseFuture, init) {
+    ResponseFuture responseFuture(13, 4, NULL, 1000);
+    EXPECT_EQ(responseFuture.getRequestCode(), 13);
+    EXPECT_EQ(responseFuture.getOpaque(), 4);
+
+    EXPECT_EQ(responseFuture.getRequestCommand().getCode(), 0);
+    EXPECT_FALSE(responseFuture.isSendRequestOK());
+    EXPECT_EQ(responseFuture.getMaxRetrySendTimes(), 1);
+    EXPECT_EQ(responseFuture.getRetrySendTimes(), 1);
+    EXPECT_EQ(responseFuture.getBrokerAddr(), "");
+
+    EXPECT_FALSE(responseFuture.getASyncFlag());
+    EXPECT_TRUE(responseFuture.getAsyncResponseFlag());
+    EXPECT_FALSE(responseFuture.getSyncResponseFlag());
+    EXPECT_TRUE(responseFuture.getAsyncCallbackWrap() == nullptr);
+
+    // ~ResponseFuture  delete pcall
+    SendCallbackWrap *pcall = new SendCallbackWrap("", MQMessage(), nullptr, nullptr);
+    ResponseFuture twoResponseFuture(13, 4, nullptr, 1000, true, pcall);
+    EXPECT_TRUE(twoResponseFuture.getASyncFlag());
+    EXPECT_FALSE(twoResponseFuture.getAsyncResponseFlag());
+    EXPECT_TRUE(twoResponseFuture.getSyncResponseFlag());
+    EXPECT_FALSE(twoResponseFuture.getAsyncCallbackWrap() == nullptr);
+}
+
+TEST(responseFuture, info) {
+    ResponseFuture responseFuture(13, 4, NULL, 1000);
+
+    responseFuture.setAsyncResponseFlag();
+    EXPECT_TRUE(responseFuture.getAsyncResponseFlag());
+
+    responseFuture.setBrokerAddr("127.0.0.1:9876");
+    EXPECT_EQ(responseFuture.getBrokerAddr(), "127.0.0.1:9876");
+
+    responseFuture.setMaxRetrySendTimes(3000);
+    EXPECT_EQ(responseFuture.getMaxRetrySendTimes(), 3000);
+
+    responseFuture.setRetrySendTimes(3000);
+    EXPECT_EQ(responseFuture.getRetrySendTimes(), 3000);
+
+    responseFuture.setSendRequestOK(true);
+    EXPECT_TRUE(responseFuture.isSendRequestOK());
+}
+
+TEST(responseFuture, response) {
+    // m_bAsync = false  m_syncResponse
+    ResponseFuture responseFuture(13, 4, NULL, 1000);
+
+    EXPECT_FALSE(responseFuture.getASyncFlag());
+    EXPECT_FALSE(responseFuture.getSyncResponseFlag());
+    EXPECT_TRUE(responseFuture.getAsyncResponseFlag());
+
+    RemotingCommand *pResponseCommand = NULL;
+    responseFuture.setResponse(pResponseCommand);
+    EXPECT_EQ(responseFuture.getRequestCommand().getCode(), 0);
+
+    EXPECT_TRUE(responseFuture.getSyncResponseFlag());
+
+    // m_bAsync = true  m_syncResponse
+    ResponseFuture twoResponseFuture(13, 4, NULL, 1000, true);
+
+    EXPECT_TRUE(twoResponseFuture.getASyncFlag());
+    EXPECT_TRUE(twoResponseFuture.getSyncResponseFlag());
+    EXPECT_FALSE(twoResponseFuture.getAsyncResponseFlag());
+
+    twoResponseFuture.setResponse(pResponseCommand);
+    EXPECT_TRUE(twoResponseFuture.getSyncResponseFlag());
+
+    ResponseFuture threeSesponseFuture(13, 4, NULL, 1000);
+
+    uint64_t millis = UtilAll::currentTimeMillis();
+    RemotingCommand *remotingCommand = threeSesponseFuture.waitResponse(10);
+    uint64_t useTime = UtilAll::currentTimeMillis() - millis;
+    EXPECT_LT(useTime, 30);
+
+    EXPECT_TRUE(responseFuture.getSyncResponseFlag());
+    EXPECT_EQ(NULL, remotingCommand);
+}
+
+TEST(responseFuture, executeInvokeCallback) {
+    //  executeInvokeCallback delete wrap
+    MockAsyncCallbackWrap *wrap = new MockAsyncCallbackWrap(nullptr, nullptr);
+    ResponseFuture responseFuture(13, 4, nullptr, 1000, false, wrap);
+
+    RemotingCommand *pResponseCommand = new RemotingCommand();
+    responseFuture.setResponse(pResponseCommand);
+    responseFuture.executeInvokeCallback();
+    EXPECT_EQ(NULL, responseFuture.getCommand());
+
+    EXPECT_CALL(*wrap, operationComplete(_, _)).Times(1);
+    pResponseCommand = new RemotingCommand();
+    responseFuture.setResponse(pResponseCommand);
+    responseFuture.setAsyncCallBackStatus(asyncCallBackStatus::asyncCallBackStatus_response);
+    responseFuture.executeInvokeCallback();
+    EXPECT_EQ(pResponseCommand->getCode(), 0);
+
+    ResponseFuture twoResponseFuture(13, 4, nullptr, 1000, false, NULL);
+    pResponseCommand = new RemotingCommand();
+    twoResponseFuture.executeInvokeCallback();
+    EXPECT_EQ(NULL, twoResponseFuture.getCommand());
+}
+
+TEST(responseFuture, executeInvokeCallbackException) {
+    //  executeInvokeCallbackException delete wrap
+    MockAsyncCallbackWrap *wrap = new MockAsyncCallbackWrap(nullptr, nullptr);
+
+    ResponseFuture responseFuture(13, 4, nullptr, 1000, false, wrap);
+
+    EXPECT_CALL(*wrap, onException()).Times(1);
+    responseFuture.executeInvokeCallbackException();
+
+    responseFuture.setAsyncCallBackStatus(asyncCallBackStatus::asyncCallBackStatus_timeout);
+    responseFuture.executeInvokeCallbackException();
+
+    ResponseFuture twoRresponseFuture(13, 4, nullptr, 1000, false, NULL);
+    twoRresponseFuture.executeInvokeCallbackException();
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "responseFuture.*";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/test/src/transport/SocketUtilTest.cpp b/test/src/transport/SocketUtilTest.cpp
new file mode 100644
index 0000000..875f2e7
--- /dev/null
+++ b/test/src/transport/SocketUtilTest.cpp
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+#include "SocketUtil.h"
+
+using ::testing::InitGoogleMock;
+using ::testing::InitGoogleTest;
+using testing::Return;
+
+TEST(socketUtil, init) {
+    sockaddr addr = rocketmq::IPPort2socketAddress(inet_addr("127.0.0.1"), 10091);
+
+    EXPECT_EQ(rocketmq::socketAddress2IPPort(addr), "1.0.0.127:10091");
+
+    int host;
+    int port;
+
+    rocketmq::socketAddress2IPPort(addr, host, port);
+    EXPECT_EQ(host, inet_addr("127.0.0.1"));
+    EXPECT_EQ(port, 10091);
+
+    EXPECT_EQ(rocketmq::socketAddress2String(addr), "1.0.0.127");
+}
+
+int main(int argc, char *argv[]) {
+    InitGoogleMock(&argc, argv);
+    testing::GTEST_FLAG(throw_on_failure) = true;
+    testing::GTEST_FLAG(filter) = "socketUtil.init";
+    int itestts = RUN_ALL_TESTS();
+    return itestts;
+}
diff --git a/win32_build.bat b/win32_build.bat
index 19c6de4..0cc2e0c 100644
--- a/win32_build.bat
+++ b/win32_build.bat
@@ -14,11 +14,15 @@
 : * See the License for the specific language governing permissions and
 : * limitations under the License.
 : */
+
 if "%1" == "build" (
 	call:build
+) 
+if "%1" == "build64" (
+	call:build64
 ) else (
 	call:download
-	call:build
+	call:build64
 )
 goto:eof
 
@@ -37,21 +41,61 @@
 
 :build --build all project
 @echo build start
-cd thirdparty
-@if "%programfiles%"=="" ("set programfiles=c:\Program Files (x86)")
+cd thirdparty/boost_1_58_0
+@if "%programfiles%"=="" ("set programfiles=E:\Program Files (x86)")
 call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat"
+:: amd64
+
+::call ""E:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64
+
 set  ZLIB_SOURCE="%cd%\zlib-1.2.3-src\src\zlib\1.2.3\zlib-1.2.3\"
-cd boost_1_58_0
+::cd boost_1_58_0
 call bootstrap.bat
 @echo build start.....
-bjam.exe --with-serialization --with-atomic --with-log --with-locale --with-iostreams --with-system --with-regex --with-thread --with-date_time --with-chrono --with-filesystem  link=static  threading=multi variant=release runtime-link=shared
+bjam.exe address-model=32 --with-serialization --with-atomic --with-log --with-locale --with-iostreams --with-system --with-regex --with-thread --with-date_time --with-chrono --with-filesystem  link=static  threading=multi variant=release runtime-link=shared
 cd ../jsoncpp-0.10.6
-devenv ./jsoncpp_lib_static.vcxproj  /Rebuild "Release|x86" /out log.txt
+devenv ./jsoncpp_lib_static.vcxproj  /Rebuild "Debug|x86" /out log.txt
 cd ../libevent-release-2.0.22
-devenv ./libevent.vcxproj  /Rebuild "Release|x86" /out log.txt
+devenv ./libevent.vcxproj  /Rebuild "Debug|x86" /out log.txt
 cd ../../Win32
-devenv ./rocketmq-client-cpp.sln  /Rebuild "Release|x86" /out log.txt
-cd ..
+::cd ./Win32
+::devenv ./rocketmq-client-cpp.sln  /Rebuild "Release|x64" /out log.txt
+::devenv ./rocketmq-client-cpp.vcxproj /Build "Release|x64" /out log.txt
+devenv ./rocketmq-client-cpp.sln /Build "Debug|x86" /out log.txt
+::devenv ./rocketmq-client-cpp.vcxproj /Rebuild "Release|x64" /out log.txt
+::cd ..
 @echo build end
 goto:eof
 
+
+
+:build64 --build all project
+@echo build start
+cd thirdparty/boost_1_58_0
+@if "%programfiles%"=="" ("set programfiles=E:\Program Files (x86)")
+call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.bat"
+:: amd64
+
+::call ""E:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64
+
+set  ZLIB_SOURCE="%cd%\zlib-1.2.3-src\src\zlib\1.2.3\zlib-1.2.3\"
+set  ZLIB_INCLUDE="%cd%\zlib-1.2.3-src\src\zlib\1.2.3\zlib-1.2.3\"
+
+
+::cd boost_1_58_0
+call bootstrap.bat
+@echo build start.....
+bjam.exe address-model=64 --with-serialization --with-atomic --with-log --with-locale --with-iostreams --with-system --with-regex --with-thread --with-date_time --with-chrono --with-filesystem  link=static  threading=multi variant=release runtime-link=shared
+cd ../jsoncpp-0.10.6
+devenv ./jsoncpp_lib_static.vcxproj  /Build "Release|x64" /out log.txt
+cd ../libevent-release-2.0.22
+devenv ./libevent.vcxproj  /Build "Release|x64" /out log.txt
+cd ../../Win32
+::cd ./Win32
+::devenv ./rocketmq-client-cpp.sln  /Rebuild "Release|x64" /out log.txt
+::devenv ./rocketmq-client-cpp.vcxproj /Build "Release|x64" /out log.txt
+devenv ./rocketmq-client-cpp.sln /Build "Release|x64" /out log.txt
+::devenv ./rocketmq-client-cpp.vcxproj /Rebuild "Release|x64" /out log.txt
+::cd ..
+@echo build end
+goto:eof
\ No newline at end of file