gpt4 book ai didi

c - 处理 WSARecv 的立即返回

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:49 27 4
gpt4 key购买 nike

我正在使用 WSARecv 实现一个异步服务器。根据文档,WSARecv 可以立即返回 0。这最终仍会调用我的完成例程,我会在其中再次调用 WSARecv 以获取其余数据。如果没有更多数据可供抓取,我预计我对 WSARecv 的后续调用将导致其完成例程在第二个参数中接收到 0 字节。

所以,我调用接收:

// ret is zero after this call.
int ret = WSARecv(socket, buf, 1, &RecvBytes, &Flags, overlapped, WorkerRoutine);

最终,这调用了我的完成例程 WorkerRoutine,我在其中对数据进行了一些处理,并最终再次调用 WSARecv 以获取数据的剩余部分。

void CALLBACK WorkerRoutine(DWORD recv_error, DWORD bytes, LPWSAOVERLAPPED overlapped, DWORD recv_flags)
{
int ret = 0;
const char* error = 0;
DWORD num_bytes = 0;
DWORD flags = 0;

if (recv_error != 0) {
goto cleanup;
}

// This is non-zero on the first call to the completion routine.
if (bytes == 0) {
return;
}

//... Omitted some data handling code.

WSABUF buf;
buf.buf = buffer;
buf.len = buff_size;
SecureZeroMemory(overlapped, sizeof(WSAOVERLAPPED));

// ret is -1 here and WSAGetLastError() == WSA_IO_PENDING
ret = WSARecv(sock, &buf, 1, &num_bytes, &flags, overlapped, WorkerRoutine);

如果我发送少量数据(< buff_size,例如 'hello'),对 WSARecv 的第一次调用将立即返回。完成例程仍然被调用,但我没有完全退出完成例程,而是发出另一个 WSARecv。我假设第二个完成例程最终会被调用,我可以在其中检查 bytes 是否为零,如果为零则退出(无需再次调用 WSARecv)。相反,第二个完成例程永远不会执行。

这是对完成例程如何工作的误解吗?忽略第二个完成例程永远不会触发的事实是否安全?

为了完整起见,我使用 Python 脚本与我的服务器进行交互:

import socket
import sys
import time

HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
# Connect to server and send data
sock.connect((HOST, PORT))
sock.sendall(data + "\n")

# Receive data from the server and shut down
received = sock.recv(1024)
finally:
sock.close()

print "Sent: {}".format(data)
print "Received: {}".format(received)

是否因为我与 Python 的交互方式而没有得到“数据结束”?

最佳答案

如果 WSARecv 返回 -1 并且 GetLastError 不是 WSA_IO_PENDING 则不会有异步完成。如果您想通过额外的异步操作来处理这种情况,您可以使用 QueueUserAPC 或 PostQueuedCompletionStatus 自行安排。

关于c - 处理 WSARecv 的立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47824583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com