diff --git a/example/echo_client/echo_client_stackfull.cpp b/example/echo_client/echo_client_stackfull.cpp index 69bb889..78a9de0 100644 --- a/example/echo_client/echo_client_stackfull.cpp +++ b/example/echo_client/echo_client_stackfull.cpp @@ -2,11 +2,6 @@ #include "universal_fiber.hpp" -#ifdef _WIN32 -LPFN_DISCONNECTEX DisconnectEx = nullptr; -LPFN_CONNECTEX WSAConnectEx = nullptr; -#endif - #include #define PORT 50001 @@ -36,7 +31,6 @@ static void echo_client(HANDLE iocp_handle, const char* lp_server_addr) FiberOVERLAPPED ov; - auto result = WSAConnectEx(sock, (const SOCKADDR*) &server_addr, INET_ADDRSTRLEN, 0, 0, 0, &ov.ov); float c = ov.last_error + 1; @@ -106,22 +100,7 @@ int main(int argc, char* argv[]) HANDLE iocp_handle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); #ifdef _WIN32 - { - SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); - auto_sockethandle auto_close(sock); - - GUID disconnectex = WSAID_DISCONNECTEX; - GUID connect_ex_guid = WSAID_CONNECTEX; - DWORD BytesReturned; - - WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, - &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), - &BytesReturned, 0, 0); - - WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, - &connect_ex_guid, sizeof(GUID), &WSAConnectEx, sizeof(WSAConnectEx), &BytesReturned, 0, 0); - } - + init_winsock_api_pointer(); #endif float cc = 8; diff --git a/example/echo_server/echo_server_callback.cpp b/example/echo_server/echo_server_callback.cpp index 4e94112..0c85215 100644 --- a/example/echo_server/echo_server_callback.cpp +++ b/example/echo_server/echo_server_callback.cpp @@ -5,7 +5,6 @@ #include #include - // ----------------------------------------------------------------------------- enum // configuration @@ -205,6 +204,11 @@ static void init_winsock(void) printf("* error in WSAStartup!\n"); exit(1); } + +#ifdef _WIN32 + init_winsock_api_pointer(); +#endif + } // ----------------------------------------------------------------------------- diff --git a/example/echo_server/echo_server_stackfull.c b/example/echo_server/echo_server_stackfull.c index 8eaaeb6..cf09ddf 100644 --- a/example/echo_server/echo_server_stackfull.c +++ b/example/echo_server/echo_server_stackfull.c @@ -6,6 +6,12 @@ #include #include +#ifdef _WIN32 +LPFN_ACCEPTEX _AcceptEx = NULL; +LPFN_DISCONNECTEX DisconnectEx = NULL; + +#define AcceptEx _AcceptEx +#endif // ----------------------------------------------------------------------------- @@ -205,6 +211,25 @@ static void init_winsock(void) printf("* error in WSAStartup!\n"); exit(1); } + +#ifdef _WIN32 + GUID disconnectex = WSAID_DISCONNECTEX; + GUID acceptex = WSAID_ACCEPTEX; + DWORD BytesReturned; + + SOCKET dummySocket = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED); + + WSAIoctl(dummySocket, SIO_GET_EXTENSION_FUNCTION_POINTER, + &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), + &BytesReturned, 0, 0); + + WSAIoctl(dummySocket, SIO_GET_EXTENSION_FUNCTION_POINTER, + &acceptex, sizeof(GUID), &_AcceptEx, sizeof(_AcceptEx), + &BytesReturned, 0, 0); + closesocket(dummySocket); + +#endif + } // ----------------------------------------------------------------------------- diff --git a/example/echo_server/echo_server_stackless.cpp b/example/echo_server/echo_server_stackless.cpp index 2518a86..752bc23 100644 --- a/example/echo_server/echo_server_stackless.cpp +++ b/example/echo_server/echo_server_stackless.cpp @@ -2,10 +2,6 @@ #include "universal_async.hpp" -#ifdef _WIN32 -LPFN_DISCONNECTEX DisconnectEx = nullptr; -#endif - #include #define PORT 50001 @@ -120,12 +116,7 @@ int main() CreateIoCompletionPort((HANDLE)(listener6), iocp_handle, 0, 0); #ifdef _WIN32 - GUID disconnectex = WSAID_DISCONNECTEX; - DWORD BytesReturned; - - WSAIoctl(listener6, SIO_GET_EXTENSION_FUNCTION_POINTER, - &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), - &BytesReturned, 0, 0); + init_winsock_api_pointer(); #endif { // Addr of listening socket diff --git a/example/web_server/server.cpp b/example/web_server/server.cpp index e598c16..e921cab 100644 --- a/example/web_server/server.cpp +++ b/example/web_server/server.cpp @@ -2,6 +2,9 @@ * In the linker options (on the project right-click, linker, input) you need add wsock32.lib or ws2_32.lib to the list of input files. */ #define DISABLE_THREADS 1 + +#include "universal_async.hpp" + #include #include #include @@ -10,24 +13,11 @@ #include #include -#include "universal_async.hpp" - #ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include - -LPFN_DISCONNECTEX DisconnectEx = nullptr; #define WSA_FLAG_FAKE_CREATION 0 - #define SOCKET_get_fd(s) (s) #define MSG_NOSIGNAL 0 #define getcwd(a,b) GetCurrentDirectory(b,a) -#else -#include "iocp.h" #endif #define forever while(true) @@ -436,14 +426,8 @@ class httpServer { listenSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); if (listenSocket == INVALID_SOCKET) errorHandle("socket"); - #ifdef _WIN32 - GUID disconnectex = WSAID_DISCONNECTEX; - DWORD BytesReturned; - - WSAIoctl(listenSocket, SIO_GET_EXTENSION_FUNCTION_POINTER, - &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), - &BytesReturned, 0, 0); + init_winsock_api_pointer(); #endif if (CreateIoCompletionPort((HANDLE)listenSocket6, eventQueue, (ULONG_PTR)0, 0) == NULL) errorHandle("IOCP bind socket6"); diff --git "a/\302\265async/CMakeLists.txt" "b/\302\265async/CMakeLists.txt" index c087817..bb259e3 100644 --- "a/\302\265async/CMakeLists.txt" +++ "b/\302\265async/CMakeLists.txt" @@ -14,7 +14,7 @@ endif() set_property(TARGET uasync PROPERTY CXX_STANDARD 23) -if (NOT DISABLE_BOOST_CONTEXT AND NOT WIN32) +if (NOT DISABLE_BOOST_CONTEXT) add_subdirectory(asm) target_compile_definitions(uasync INTERFACE -DUSE_BOOST_CONTEXT=1) target_link_libraries(uasync INTERFACE fcontext) diff --git "a/\302\265async/include/easy_iocp.hpp" "b/\302\265async/include/easy_iocp.hpp" index 868443b..18b5532 100644 --- "a/\302\265async/include/easy_iocp.hpp" +++ "b/\302\265async/include/easy_iocp.hpp" @@ -1,7 +1,6 @@ #pragma once - #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -9,7 +8,6 @@ #include #include #pragma comment(lib, "ws2_32.lib") -#pragma comment(lib, "Mswsock.lib") #ifndef SOCKET_get_fd #define SOCKET_get_fd(x) (x) #endif @@ -77,3 +75,41 @@ inline void run_event_loop(HANDLE iocp_handle) } } } + +#if defined(_WIN32) +inline LPFN_CONNECTEX WSAConnectEx = nullptr; +inline LPFN_DISCONNECTEX DisconnectEx = nullptr; +inline LPFN_GETACCEPTEXSOCKADDRS _GetAcceptExSockaddrs = nullptr; +inline LPFN_ACCEPTEX _AcceptEx = nullptr; + +#define AcceptEx _AcceptEx +#define GetAcceptExSockaddrs _GetAcceptExSockaddrs + +inline void init_winsock_api_pointer() +{ + SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); + + GUID disconnectex = WSAID_DISCONNECTEX; + GUID connect_ex_guid = WSAID_CONNECTEX; + GUID acceptex = WSAID_ACCEPTEX; + GUID getacceptexsockaddrs = WSAID_GETACCEPTEXSOCKADDRS; + DWORD BytesReturned; + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), + &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &connect_ex_guid, sizeof(GUID), &WSAConnectEx, sizeof(WSAConnectEx), &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &acceptex, sizeof(GUID), &_AcceptEx, sizeof(_AcceptEx), + &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &getacceptexsockaddrs, sizeof(GUID), &_GetAcceptExSockaddrs, sizeof(_GetAcceptExSockaddrs), + &BytesReturned, 0, 0); + closesocket(sock); +} + +#endif // defined(_WIN32) diff --git "a/\302\265async/include/universal_async.hpp" "b/\302\265async/include/universal_async.hpp" index d1ed335..e5b3232 100644 --- "a/\302\265async/include/universal_async.hpp" +++ "b/\302\265async/include/universal_async.hpp" @@ -1,9 +1,6 @@  #pragma once -#include "awaitable.hpp" -#include -#include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN @@ -12,11 +9,51 @@ #include #include #pragma comment(lib, "ws2_32.lib") -#pragma comment(lib, "Mswsock.lib") #else #include "iocp.h" #endif +#include "awaitable.hpp" +#include +#include + +#if defined(_WIN32) +inline LPFN_CONNECTEX WSAConnectEx = nullptr; +inline LPFN_DISCONNECTEX DisconnectEx = nullptr; +inline LPFN_GETACCEPTEXSOCKADDRS _GetAcceptExSockaddrs = nullptr; +inline LPFN_ACCEPTEX _AcceptEx = nullptr; + +#define AcceptEx _AcceptEx +#define GetAcceptExSockaddrs _GetAcceptExSockaddrs + +inline void init_winsock_api_pointer() +{ + SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); + + GUID disconnectex = WSAID_DISCONNECTEX; + GUID connect_ex_guid = WSAID_CONNECTEX; + GUID acceptex = WSAID_ACCEPTEX; + GUID getacceptexsockaddrs = WSAID_GETACCEPTEXSOCKADDRS; + DWORD BytesReturned; + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), + &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &connect_ex_guid, sizeof(GUID), &WSAConnectEx, sizeof(WSAConnectEx), &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &acceptex, sizeof(GUID), &_AcceptEx, sizeof(_AcceptEx), + &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &getacceptexsockaddrs, sizeof(GUID), &_GetAcceptExSockaddrs, sizeof(_GetAcceptExSockaddrs), + &BytesReturned, 0, 0); + closesocket(sock); +} + +#endif // defined(_WIN32) struct awaitable_overlapped { diff --git "a/\302\265async/include/universal_fiber.h" "b/\302\265async/include/universal_fiber.h" index e7995e0..131cfb9 100644 --- "a/\302\265async/include/universal_fiber.h" +++ "b/\302\265async/include/universal_fiber.h" @@ -9,7 +9,6 @@ #include #include #pragma comment(lib, "ws2_32.lib") -#pragma comment(lib, "Mswsock.lib") #ifndef SOCKET_get_fd #define SOCKET_get_fd(x) (x) #endif diff --git "a/\302\265async/include/universal_fiber.hpp" "b/\302\265async/include/universal_fiber.hpp" index 50c7f3d..650d876 100644 --- "a/\302\265async/include/universal_fiber.hpp" +++ "b/\302\265async/include/universal_fiber.hpp" @@ -9,7 +9,6 @@ #include #include #pragma comment(lib, "ws2_32.lib") -#pragma comment(lib, "Mswsock.lib") #ifndef SOCKET_get_fd #define SOCKET_get_fd(x) (x) #endif @@ -17,6 +16,45 @@ #include "iocp.h" #endif + +#if defined(_WIN32) +inline LPFN_CONNECTEX WSAConnectEx = nullptr; +inline LPFN_DISCONNECTEX DisconnectEx = nullptr; +inline LPFN_GETACCEPTEXSOCKADDRS _GetAcceptExSockaddrs = nullptr; +inline LPFN_ACCEPTEX _AcceptEx = nullptr; + +#define AcceptEx _AcceptEx +#define GetAcceptExSockaddrs _GetAcceptExSockaddrs + +inline void init_winsock_api_pointer() +{ + SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); + + GUID disconnectex = WSAID_DISCONNECTEX; + GUID connect_ex_guid = WSAID_CONNECTEX; + GUID acceptex = WSAID_ACCEPTEX; + GUID getacceptexsockaddrs = WSAID_GETACCEPTEXSOCKADDRS; + DWORD BytesReturned; + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &disconnectex, sizeof(GUID), &DisconnectEx, sizeof(DisconnectEx), + &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &connect_ex_guid, sizeof(GUID), &WSAConnectEx, sizeof(WSAConnectEx), &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &acceptex, sizeof(GUID), &_AcceptEx, sizeof(_AcceptEx), + &BytesReturned, 0, 0); + + WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, + &getacceptexsockaddrs, sizeof(GUID), &_GetAcceptExSockaddrs, sizeof(_GetAcceptExSockaddrs), + &BytesReturned, 0, 0); + closesocket(sock); +} + +#endif // defined(_WIN32) + #include #include