如何在不调用 GetQueuedCompletionStatus() 的情况下知道 WSASend() 操作是否已完成?
How to know if a WSASend() operation has been completed without calling GetQueuedCompletionStatus()?
当调用 WSASend()
时,我必须向它传递一个 WSAOVERLAPPED
实例,并且在上一个 WSASend()
操作完成之前我不能重新使用这个 WSAOVERLAPPED
实例已完成(即当完成数据包已放入完成端口时)。
有什么方法可以在不调用 GetQueuedCompletionStatus()
的情况下知道 WSASend()
操作是否已经完成?
您需要将自己的套接字绑定到系统创建的 IOCP,因为当操作完成时,您的回调将被自动调用。您在这里有 2 个选项:
使用 BindIoCompletionCallback
- 这将从 Windows 开始工作
XP(真的连win2000都没有)
使用 CreateThreadpoolIo
- 从 Windows Vista
工作
通过
创建套接字后
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);
当调用 WSASend()
时,我必须向它传递一个 WSAOVERLAPPED
实例,并且在上一个 WSASend()
操作完成之前我不能重新使用这个 WSAOVERLAPPED
实例已完成(即当完成数据包已放入完成端口时)。
有什么方法可以在不调用 GetQueuedCompletionStatus()
的情况下知道 WSASend()
操作是否已经完成?
您需要将自己的套接字绑定到系统创建的 IOCP,因为当操作完成时,您的回调将被自动调用。您在这里有 2 个选项:
使用
BindIoCompletionCallback
- 这将从 Windows 开始工作 XP(真的连win2000都没有)使用
CreateThreadpoolIo
- 从 Windows Vista 工作
通过
创建套接字后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);