This commit is contained in:
Manoj Ampalam 2016-03-04 15:13:29 -08:00
parent 2caf350f29
commit d0f61c3dc5
2 changed files with 34 additions and 7 deletions

View File

@ -107,7 +107,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -121,7 +121,7 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -140,7 +140,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -159,7 +159,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Mswsock.lib;Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>

View File

@ -52,6 +52,7 @@ struct acceptEx_context {
char lpOutputBuf[1024]; char lpOutputBuf[1024];
SOCKET accept_socket; SOCKET accept_socket;
LPFN_ACCEPTEX lpfnAcceptEx; LPFN_ACCEPTEX lpfnAcceptEx;
LPFN_GETACCEPTEXSOCKADDRS lpfnGuidGetAcceptExSockaddrs;
DWORD bytes_received; DWORD bytes_received;
}; };
@ -63,6 +64,7 @@ socketio_acceptEx(struct w32_io* pio) {
debug2("io:%p", pio); debug2("io:%p", pio);
if (pio->internal.context == NULL) { if (pio->internal.context == NULL) {
GUID GuidAcceptEx = WSAID_ACCEPTEX; GUID GuidAcceptEx = WSAID_ACCEPTEX;
GUID GuidGetAcceptExSockaddrs = WSAID_GETACCEPTEXSOCKADDRS;
DWORD dwBytes; DWORD dwBytes;
context = context =
@ -85,6 +87,20 @@ socketio_acceptEx(struct w32_io* pio) {
return -1; return -1;
} }
if (SOCKET_ERROR == WSAIoctl(pio->sock,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&GuidGetAcceptExSockaddrs, sizeof(GuidGetAcceptExSockaddrs),
&context->lpfnGuidGetAcceptExSockaddrs, sizeof(context->lpfnGuidGetAcceptExSockaddrs),
&dwBytes, NULL, NULL))
{
free(context);
errno = errno_from_WSALastError();
debug("ERROR:%d, io:%p", errno, pio);
return -1;
}
context->accept_socket = INVALID_SOCKET; context->accept_socket = INVALID_SOCKET;
pio->internal.context = context; pio->internal.context = context;
} }
@ -114,8 +130,8 @@ socketio_acceptEx(struct w32_io* pio) {
context->accept_socket, context->accept_socket,
context->lpOutputBuf, context->lpOutputBuf,
0, 0,
sizeof(struct sockaddr_in6) + 16, sizeof(SOCKADDR_STORAGE) + 16,
sizeof(struct sockaddr_in6) + 16, sizeof(SOCKADDR_STORAGE) + 16,
&context->bytes_received, &context->bytes_received,
&pio->read_overlapped)) &pio->read_overlapped))
{ {
@ -616,6 +632,8 @@ socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen) {
struct w32_io *accept_io = NULL; struct w32_io *accept_io = NULL;
int iResult = 0; int iResult = 0;
struct acceptEx_context* context; struct acceptEx_context* context;
struct sockaddr *local_address,*remote_address;
int local_address_len, remote_address_len;
debug2("io:%p", pio); debug2("io:%p", pio);
/* start io if not already started */ /* start io if not already started */
@ -676,7 +694,16 @@ socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen) {
context->accept_socket = INVALID_SOCKET; context->accept_socket = INVALID_SOCKET;
debug2("accept io:%p", accept_io); debug2("accept io:%p", accept_io);
/* TODO : fill in addr */ if ((addr != NULL) && (addrlen != NULL)) {
context->lpfnGuidGetAcceptExSockaddrs(context->lpOutputBuf, 0,
sizeof(SOCKADDR_STORAGE) + 16,
sizeof(SOCKADDR_STORAGE) + 16, &local_address,
&local_address_len, &remote_address, &remote_address_len);
if (remote_address_len) {
memcpy(addr, remote_address, remote_address_len);
addrlen = remote_address_len;
}
}
return accept_io; return accept_io;
on_error: on_error: