GetQueuedCompletionStatus返回后发生错误,错误号为ERROR_INVALID_NETNAME

时间:2013-07-09 04:15:16

标签: iocp

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);
}

1 个答案:

答案 0 :(得分:0)

要检查几件事:

  • ip来自哪里?您可能需要使用htonl

  • 套接字是如何创建的?也许您的特定套接字无法处理IPv4地址(例如,它是IPv6套接字)。

此外,在调用GetQueuedCompletionStatus之前,请确保GetLastError返回FALSE。 GetQueuedCompletionStatus有三种可能的结果:

  • 返回值TRUE:

    完成数据包成功出列,I / O成功完成。

  • 返回值FALSE,OVERLAPPED设置为NULL:

    GetQueuedCompletionStatus本身无法使完成出列(例如超时)。

  • 返回值为FALSE,OVERLAPPED不为NULL:

    完成数据包已出列,但它所代表的I / O失败。