Skip to content

Commit

Permalink
SIO_GET_EXTENSION_FUNCTION_POINTER 统一化
Browse files Browse the repository at this point in the history
  • Loading branch information
microcai committed Dec 23, 2024
1 parent 3d45739 commit c9babf4
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 62 deletions.
23 changes: 1 addition & 22 deletions example/echo_client/echo_client_stackfull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@

#include "universal_fiber.hpp"

#ifdef _WIN32
LPFN_DISCONNECTEX DisconnectEx = nullptr;
LPFN_CONNECTEX WSAConnectEx = nullptr;
#endif

#include <stdio.h>

#define PORT 50001
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
6 changes: 5 additions & 1 deletion example/echo_server/echo_server_callback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

#include <stdio.h>
#include <stdlib.h>

// -----------------------------------------------------------------------------

enum // configuration
Expand Down Expand Up @@ -205,6 +204,11 @@ static void init_winsock(void)
printf("* error in WSAStartup!\n");
exit(1);
}

#ifdef _WIN32
init_winsock_api_pointer();
#endif

}

// -----------------------------------------------------------------------------
Expand Down
25 changes: 25 additions & 0 deletions example/echo_server/echo_server_stackfull.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
#include <stdio.h>
#include <stdlib.h>

#ifdef _WIN32
LPFN_ACCEPTEX _AcceptEx = NULL;
LPFN_DISCONNECTEX DisconnectEx = NULL;

#define AcceptEx _AcceptEx
#endif

// -----------------------------------------------------------------------------

Expand Down Expand Up @@ -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

}

// -----------------------------------------------------------------------------
Expand Down
11 changes: 1 addition & 10 deletions example/echo_server/echo_server_stackless.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@

#include "universal_async.hpp"

#ifdef _WIN32
LPFN_DISCONNECTEX DisconnectEx = nullptr;
#endif

#include <stdio.h>

#define PORT 50001
Expand Down Expand Up @@ -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
Expand Down
24 changes: 4 additions & 20 deletions example/web_server/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <cstdio>
#include <iostream>
#include <string>
Expand All @@ -10,24 +13,11 @@
#include <array>
#include <time.h>

#include "universal_async.hpp"

#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mswsock.h>
#include <winbase.h>

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)
Expand Down Expand Up @@ -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");
Expand Down
2 changes: 1 addition & 1 deletion µasync/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
40 changes: 38 additions & 2 deletions µasync/include/easy_iocp.hpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@

#pragma once


#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mswsock.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")
#ifndef SOCKET_get_fd
#define SOCKET_get_fd(x) (x)
#endif
Expand Down Expand Up @@ -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)
45 changes: 41 additions & 4 deletions µasync/include/universal_async.hpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@

#pragma once

#include "awaitable.hpp"
#include <cstdint>
#include <mutex>

#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
Expand All @@ -12,11 +9,51 @@
#include <ws2tcpip.h>
#include <mswsock.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")
#else
#include "iocp.h"
#endif

#include "awaitable.hpp"
#include <cstdint>
#include <mutex>

#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
{
Expand Down
1 change: 0 additions & 1 deletion µasync/include/universal_fiber.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <ws2tcpip.h>
#include <mswsock.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")
#ifndef SOCKET_get_fd
#define SOCKET_get_fd(x) (x)
#endif
Expand Down
40 changes: 39 additions & 1 deletion µasync/include/universal_fiber.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,52 @@
#include <ws2tcpip.h>
#include <mswsock.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")
#ifndef SOCKET_get_fd
#define SOCKET_get_fd(x) (x)
#endif
#else
#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 <cstdint>
#include <cstddef>

Expand Down

0 comments on commit c9babf4

Please sign in to comment.