如何在不调用 GetQueuedCompletionStatus() 的情况下知道 WSASend() 操作是否已完成?

How to know if a WSASend() operation has been completed without calling GetQueuedCompletionStatus()?

当调用 WSASend() 时,我必须向它传递一个 WSAOVERLAPPED 实例,并且在上一个 WSASend() 操作完成之前我不能重新使用这个 WSAOVERLAPPED 实例已完成(即当完成数据包已放入完成端口时)。

有什么方法可以在不调用 GetQueuedCompletionStatus() 的情况下知道 WSASend() 操作是否已经完成?

您需要将自己的套接字绑定到系统创建的 IOCP,因为当操作完成时,您的回调将被自动调用。您在这里有 2 个选项:

通过

创建套接字后
SOCKET socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED)

您需要致电 BindIoCompletionCallback((HANDLE)socket, *,0)CreateThreadpoolIo((HANDLE)socket, *, 0, 0);

和所有。你根本不需要打电话 GetQueuedCompletionStatus() 或等待

您可以使用 WSAGetOverlappedResult 获得 WSASend 级数:

/* size bytes to send */
WSASend(Sock, &aBuf, 1, NULL, 0, &overlap, NULL);

/* warning no test for error cases */
DWORD dummy;
DWORD sent;   
do 
{
    /* Ask for the sending progression without waiting */
    WSAGetOverlappedResult(Sock, &SendOverlapped, &sent, FALSE, &dummy);
    /* to prevent too much CPU usage */
    Sleep(15);
} while (size != sent);