GetQueuedCompletionStatus 返回后发生错误,错误号为 ERROR_INVALID_NETNAME
Posted
技术标签:
【中文标题】GetQueuedCompletionStatus 返回后发生错误,错误号为 ERROR_INVALID_NETNAME【英文标题】:an error occurs after GetQueuedCompletionStatus returns, error number is ERROR_INVALID_NETNAME 【发布时间】:2013-07-09 04:15:16 【问题描述】:GetQueuedCompletionStatus 失败并显示 ERROR_INVALID_NETNAME。这是什么意思?我尝试在 MSDN 中查找。
第一步:使用ConnectEx连接到服务器。 ConnectEx 成功,错误代码 997 (ERROR_IO_PENDING):
DWORD bytes = 0;
sockaddr_in addr = 0;
iocp_data_t * iocp = (iocp_data_t *)module->data;
addr.sin_addr.s_addr = ip;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if(!iocp->tcp_connectex(event->fd, (const sockaddr*)&addr, sizeof(sockaddr_in),
NULL, 0, NULL, &event->connect.overlap))
if(!ERR_RW_RETRIABLE(socket_geterror(event->fd)))
return false;
return true;
GetQueuedCompletionStatus 在ConnectEx 调用完成后返回,但错误代码为 1214 (ERROR_INVALID_NETNAME):
fd_event_t * fd_event;
iocp_data_t * iocp = (iocp_data_t *)module->data;
rc = GetQueuedCompletionStatus(iocp->iocp, &bytes, (PULONG_PTR)&fd_event,
(LPOVERLAPPED *) &event, (u_long) 1);
if(event == NULL)
return;
DWORD err = GetLastError(); // err = 1214
event = containing_record(event,event_t,overlap);
if(event->in_used)
if(event->event_handler != NULL)
event->event_handler(module,fd_event,event->type,event->user);
iocp_add_event(module,fd_event,event->type,event->event_handler,event->user);
【问题讨论】:
AFAIKERROR_INVALID_NETNAME
不是GetQueuedCompletionStatus()
可以报告的错误代码。请举一个真实的例子。
【参考方案1】:
需要检查的几件事:
ip
来自哪里?您可能需要使用htonl。
套接字是如何创建的?也许您的特定套接字无法处理 IPv4 地址(例如,它是 IPv6 套接字)。
此外,在调用 GetLastError 之前,请确保 GetQueuedCompletionStatus 返回 FALSE。 GetQueuedCompletionStatus 有三种可能的结果:
返回值为真:
完成包成功出列,I/O 成功完成。
FALSE 的返回值,OVERLAPPED 设置为 NULL:
GetQueuedCompletionStatus 本身未能使完成出队(例如超时)。
返回值为 FALSE,OVERLAPPED 不为 NULL:
完成包出队,但它代表的 I/O 失败。
【讨论】:
以上是关于GetQueuedCompletionStatus 返回后发生错误,错误号为 ERROR_INVALID_NETNAME的主要内容,如果未能解决你的问题,请参考以下文章
如何强制 GetQueuedCompletionStatus() 立即返回?
一些使用 WSASend 的 OVERLAPS 没有使用 GetQueuedCompletionStatus 及时返回?
当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?
GetQueuedCompletionStatus 返回后发生错误,错误号为 ERROR_INVALID_NETNAME
GetQueuedCompletionStatus 继续选择关闭套接字上的事件
io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend