2

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; 

ConnectEx呼び出しが終了すると、 GetQueuedCompletionStatusが返されますが、エラー コード 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);
}
4

1 に答える 1

0

いくつかの確認事項:

  • どこipから来たの?htonlを使用する必要がある場合があります。

  • ソケットはどのように作成されますか? 特定のソケットが IPv4 アドレスを処理できない可能性があります (例: IPv6 ソケット)。

また、GetLastErrorを呼び出す前に、 GetQueuedCompletionStatusが FALSE を返すことを確認してください。 GetQueuedCompletionStatusには、次の 3 つの結果が考えられます。

  • TRUE の戻り値:

    完了パケットが正常にデキューされ、I/O が正常に終了しました。

  • OVERLAPPED が NULL に設定された FALSE の戻り値:

    GetQueuedCompletionStatus 自体が完了をデキューできませんでした (タイムアウトなど)。

  • NULL 以外の OVERLAPPED を含む FALSE の戻り値:

    完了パケットはキューから取り出されましたが、それが表す I/O は失敗しました。

于 2013-07-28T00:32:04.600 に答える