2011-11-01 495 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

相关问题