2013-07-09 25 views
2

GetQueuedCompletionStatus失敗,並返回ERROR_INVALID_NETNAME。這是什麼意思?我試着在MSDN中查找。GetQueuedCompletionStatus返回後發生錯誤,錯誤號爲ERROR_INVALID_NETNAME

第一步:使用ConnectEx連接到服務器。 ConnectEx成功,錯誤代碼997(ERROR_IO_PENDING):在ConnectEx通話結束後

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回報,但是,錯誤代碼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); 
} 
+0

AFAIK'ERROR_INVALID_NETNAME'不是'GetQueuedCompletionStatus()'可以報告的錯誤代碼。請舉一個真實的例子。 –

回答

0

幾件事情要檢查:

  • ip從哪裏來?您可能需要使用htonl

  • 套接字是如何創建的?也許你的特定套接字不能處理IPv4地址(例如它是一個IPv6套接字)。

此外,確保GetQueuedCompletionStatus返回調用GetLastError前FALSE。 GetQueuedCompletionStatus有三種可能的結果:

  • 的TRUE返回值:

    完成數據包成功離隊,以及I/O成功完成。

  • 的FALSE返回值,與重疊設置爲NULL:

    GetQueuedCompletionStatus時本身沒有一個出列完成(例如超時)。

  • 的假返回值,用重疊不是NULL:

    完成數據包出隊,但I/O它代表失敗。