When using AcceptEx and lpfnAcceptEx equally, only lpfnAcceptEx throws an error

20 views Asked by At

In the AcceptEx part of the code, the address information is written to the buffer normally, but when I check the lpfnAcceptEx part by calling GetAcceptExSockaddrs later, the local and remote addresses are nullptr. Do you have any idea why? If it's AcceptEx, everything is fine

Server server(8000);
    LPSession ses = nullptr;

    GUID GuidDisconnectEx = WSAID_DISCONNECTEX;
    GUID GuidAcceptEx = WSAID_ACCEPTEX;
    
    
    for (int i = 0; i < 50; ++i)
    {
        DWORD dwBytes;
        SOCKADDR_IN caddr;
        int addrlen = sizeof(caddr);
        ZeroMemory(&caddr, addrlen);

        ses = server.Add_Session(new Session(&server));

        WSAIoctl(ses->sock, SIO_GET_EXTENSION_FUNCTION_POINTER,
            &GuidAcceptEx,sizeof(GuidAcceptEx),
            &ses->lpfnAcceptEx, sizeof(ses->lpfnAcceptEx),
            &dwBytes, NULL, NULL);

        WSAIoctl(ses->sock, SIO_GET_EXTENSION_FUNCTION_POINTER,
            &GuidDisconnectEx, sizeof(GuidDisconnectEx),
            &ses->lpfnDisconnectEx, sizeof(ses->lpfnDisconnectEx),
            &dwBytes, NULL, NULL);

        ses->lpfnAcceptEx(server.listen_sock, ses->sock, &ses->aio->buf, 0,
            sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, NULL,
            reinterpret_cast<LPOVERLAPPED>(&ses->aio->over));

        AcceptEx(server.listen_sock, ses->sock, &ses->aio->buf, 0,
            sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16, NULL,
            reinterpret_cast<LPOVERLAPPED>(&ses->aio->over));



        if (i == 49)
            cout << "Ready" << endl;
    }
PSOCKADDR pRemoteSocketAddr = nullptr;
    PSOCKADDR pLocalSocketAddr = nullptr;
    INT pRemoteSocketAddrLength = 0;
    INT pLocalSocketAddrLength = 0;


    GetAcceptExSockaddrs(
        &session->aio->buf, 0,
        sizeof(SOCKADDR_IN) + 16, sizeof(SOCKADDR_IN) + 16,
        &pLocalSocketAddr, &pLocalSocketAddrLength, &pRemoteSocketAddr, &pRemoteSocketAddrLength);

    SOCKADDR_IN remoteAddr = *(reinterpret_cast<PSOCKADDR_IN>(pRemoteSocketAddr));
0

There are 0 answers