2011-11-01 112 views
2

我試着在mingw上創建UDP套接字,但是socket()返回-1,errno = 0。奇怪。 我已經包含了winsock2.h。 最初,我編譯錯誤undefined reference to [email protected],設置 -lws2_32-lwsock32鏈接器設置Code :: Block,編譯成功。socket()返回-1但是errno 0

sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
RDF_LOG(kDEBUG, "sockfd %d ", sockfd); 
if (sockfd < 0){ 
    RDF_LOG(kERROR, "ERROR: %s , errno %d\n", strerror(errno), errno); 
} 

結果 - > 的sockfd -1 錯誤:沒有錯誤,錯誤號0


OK,我改變RDF_LOG,而不是fprintf中。

int tmp = 0; 

sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
tmp = errno; 
fprintf(stderr, "sockfd %d ", sockfd); 
if (sockfd < 0){ 
    fprintf(stderr, "socket: %s , errno %d\n", strerror(tmp), tmp); 
} 

結果返回,仍然, - >的sockfd -1插座:沒有錯誤,錯誤號0 難道MinGW的不支持錯誤號?

回答

7

第一件事我會做的是:

sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
int tmp = errno; 
RDF_LOG(kDEBUG, "sockfd %d ", sockfd); 
if (sockfd < 0){ 
    RDF_LOG(kERROR, "ERROR: %s , errno %d\n", strerror(tmp), tmp); 
} 

我不知道RDF_LOG可能會做的errno變量,這會告訴你它是否改變與否。

要尋找的另一件事是,您已成功執行您的WSAStartup。以下最低的程序應該有希望告訴你如何做到這一點,並提供用於調試的起點:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <winsock2.h> 

int main (void) { 
    WSADATA wsaData; 
    int listenFd; 

    if (WSAStartup(MAKEWORD(1,1), &wsaData) == SOCKET_ERROR) { 
     printf ("Error initialising WSA.\n"); 
     return -1; 
    } 

    listenFd = socket (AF_INET, SOCK_STREAM, 0); 
    if (listenFd < 0) { 
     printf ("Error %d opening socket.\n", errno); 
     return -1; 
    } 

    return 0; 
} 
+0

注意,標準庫函數都不允許設置'errno'爲零,而最佳實踐要求第三方的庫函數也應該避免這樣做。 –

+1

@paxdiablo是的,我沒有初始化winsock!現在它在WSAStartup之後起作用。 – twfx

3

的功能/宏RDF_LOG很可能調用被重置errno爲0。您需要socket後立即捕捉到的errno值C運行時庫的一些其他功能失敗,以便它是準確的。

5

因爲你與Windows套接字工作,你將需要使用WSAGetLastError()函數來檢查錯誤碼。 Windows套接字函數不設置errno,這就是爲什麼你看到errno的值爲0.

這個舊的MinGW wiki頁面列出了UNIX套接字和Windows套接字之間的差異,提及errno vs WSAGetLastError()差異在第5項中: http://oldwiki.mingw.org/index.php/sockets

0

在另一個答案中沒有看到這個提到,但上面的代碼存在另一個問題。 Winsock套接字描述符是SOCKET類型,它在我的MinGW winsock2.h中被定義爲unsigned int。

如果假定Winsock套接字的類型爲Unix類型的文件描述符,檢查負面的錯誤返回狀態可能會導致錯誤的錯誤報告,因爲Winsock不保證套接字描述符值將映射到正整數的有符號整數值。

返回套接字描述符(socket(),accept()等)的Winsock函數返回SOCKET_INVALID,該錯誤被定義爲(SOCKET)〜0。如上所述,您應該使用WSAGetLastError()來獲取系統錯誤號。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740516%28v=vs.85%29.aspx

相關問題