Во-первых, согласно документу [ReadFile
]:
Для асинхронных операций чтения hFile может быть любым дескриптором, который открывается с флагом FILE_FLAG_OVERLAPPED
функцией CreateFile
, или дескриптор сокета, возвращенный функцией socket
или accept
.
socket
создать дескриптор сокета с WSA_FLAG_OVERLAPPED
по умолчанию. Вы получите код ошибки 87 (ERROR_INVALID_PARAMETER
), если передадите перекрывающийся маркер и установите последний параметр ReadFile
как NULL
. Пример использования Overlapped:
OVERLAPPED oRead = { 0 };
oRead.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
iResult = ReadFile((HANDLE)ConnectSocket, buf, DEFAULT_BUFLEN, &len, &oRead);
if (!iResult && GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(oRead.hEvent, INFINITE);
}
buf[oRead.InternalHigh] = 0; //set string terminator for printf
printf("%s\n", buf);
WriteFile(hWritePipe1, buf, oRead.InternalHigh, NULL, NULL);
И лучше использовать recv()
напрямую:
iResult = recv(ConnectSocket, buf, DEFAULT_BUFLEN, 0);
buf[iResult] = 0; //set string terminator for printf
printf("%s\n", buf);
WriteFile(hWritePipe1, buf, iResult, NULL, NULL);
Кроме того, перекрывающийся сокет можно использовать для перенаправления IO для дочерних процессов Вы можете создать 2 канала для связи с дочерним процессом:
iResult = CreatePipe(&hReadPipe1, &hWritePipe1, &saAttr, DEFAULT_BUFLEN);
if (iResult == 0) {
printf("Pipe Error");
}
iResult = CreatePipe(&hReadPipe2, &hWritePipe2, &saAttr, DEFAULT_BUFLEN);
if (iResult == 0) {
printf("Pipe Error");
}
Чтение из дочернего процесса (cmd.exe
) и отправка клиенту.
Или,
Просто используйте WSASocket
вместо socket
и НЕ указывайте WSA_FLAG_OVERLAPPED
. (Рекомендуется)