2012-11-25 44 views
0

來源:setsockopt的錯誤WSAEADDRNOTAVAIL

WSADATA WSAData; 
SOCKET sock; 
if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) { 
    printf("\nProblem with WSAStartup\n\n"); 
    return FALSE; 
} 
if ((sock = WSASocket(AF_INET,SOCK_RAW,IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { 
    WSACleanup(); 
    printf("\nProblem with WSASocket\n\n"); 
    return FALSE; 
} 
int flag = 1; 
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag)) == SOCKET_ERROR) { 
    printf("getsockopt failed with error: %u\n\n", WSAGetLastError()); 
    closesocket(sock); 
    WSACleanup(); 
    return FALSE; 
} 

每次我在我的程序運行此我得到:

getsockopt failed with error: 10049 

10049是WSAEADDRNOTAVAIL錯誤代碼,這意味着「請求的地址不在有效的語境「。

請幫助,我不知道爲什麼我不斷收到此錯誤。

+0

你編譯這個到64位? –

+0

我將它編譯爲win32,並且我想保留它32而不是64. – Ian

+0

您使用的是哪個版本的Windows,編譯器和SDK? – alk

回答

0

您已經在您的來電WSASocket()指定了無效協議嘗試指定IPPROTO_TCP爲:

WSASocket(AF_INET,SOCK_RAW,IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED) 
+0

我改變了它,但我仍然得到相同的錯誤。 – Ian

+1

您發佈的代碼不會爲VS 2010調試模式引發錯誤...因此,參數和API的使用是正確的。你能發佈完整的代碼嗎? –

+0

我無法發佈其他代碼的安全問題(不要聲音陰暗哈哈),但不會有其他代碼沒有區別,因爲沒有任何變量或任何使用在這種情況下,我這裏沒有提到。我能想到的唯一的事情就是這個代碼是從主程序啓動的一個線程中獲取的。但是所有的線程都是正確的,因爲從邏輯上或語法上都沒有任何錯誤。 – Ian