оконный сервер IOCP - PullRequest
       16

оконный сервер IOCP

0 голосов
/ 15 марта 2019

У меня есть вопрос окна IOCP сервера. Я хочу отделить клиент, принимающий часть IOCP от основного. Исходный код показан ниже.

Приведенная ниже конфигурация не вызывает ошибку, но при поступлении данных ответа нет.
Что с этим не так?

iocp.c

typedef struct
{
    SOCKET hClntSock;
    SOCKADDR_IN clntAdr;
} PER_HANDLE_DATA, *LPPER_HANDLE_DATA;

extern PER_HANDLE_DATA;
extern LPPER_HANDLE_DATA;

typedef struct    // buffer info
{
    OVERLAPPED overlapped;
    WSABUF wsaBuf;
    char buffer[BUF_SIZE];
    int rwMode;    // READ or WRITE
} PER_IO_DATA, *LPPER_IO_DATA;

extern PER_IO_DATA;
extern LPPER_IO_DATA;

void iocp_accept_process(SOCKET *hServSock, HANDLE *hComPort, LPPER_HANDLE_DATA* handleInfo, LPPER_IO_DATA* ioInfo, int *recvBytes,int *flags)
{
    while (1)
    {
        SOCKET hClntSock;
        SOCKADDR_IN clntAdr;
        int addrLen = sizeof(clntAdr);

        hClntSock = accept(*hServSock, (SOCKADDR*)&clntAdr, &addrLen);
        *handleInfo = (LPPER_HANDLE_DATA)malloc(sizeof(PER_HANDLE_DATA));
        (*handleInfo)->hClntSock = hClntSock;
        memcpy(&((*handleInfo)->clntAdr), &clntAdr, addrLen);

        CreateIoCompletionPort((HANDLE)hClntSock, *hComPort, (DWORD)*handleInfo, 0);

        *ioInfo = (LPPER_IO_DATA)malloc(sizeof(PER_IO_DATA));
        memset(&((*ioInfo)->overlapped), 0, sizeof(OVERLAPPED));
        (*ioInfo)->wsaBuf.len = BUF_SIZE;
        (*ioInfo)->wsaBuf.buf = (*ioInfo)->buffer;
        (*ioInfo)->rwMode = READ;

        WSARecv((*handleInfo)->hClntSock, &((*ioInfo)->wsaBuf),
            1, (LPDWORD)&recvBytes, (LPDWORD)&flags, &((*ioInfo)->overlapped), NULL);
    }
}

main.c

unsigned int WINAPI EchoThreadMain(LPVOID pComPort)
{
    HANDLE hComPort = (HANDLE)pComPort;
    SOCKET sock;
    DWORD bytesTrans;
    LPPER_HANDLE_DATA handleInfo;
    LPPER_IO_DATA ioIfo;
    DWORD flags = 0;

    while (1)
    {
        GetQueuedCompletionStatus(hComPort, &bytesTrans,
            (LPDWORD)&handleInfo, (LPOVERLAPPED*)&ioInfo, INFINITE);
        sock = handleInfo->hClntSock;
    }

}

iocp_accept_process(&hServSock, &hComPort, &handleInfo, &ioInfo, &recvBytes, &flags);
...