У меня есть вопрос окна 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);