socket()返回-1但是errno 0

twf*_*wfx 2 c sockets mingw codeblocks winsock2

我尝试在mingw上创建一个UDP套接字,但是socket()返回-1,使用errno = 0.奇怪.我已经包含了winsock2.h.最初我有编译错误undefined reference to socket@12,在设置 -lws2_32-lwsock32Code :: Block的链接器设置后,编译成功.

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);
}
Run Code Online (Sandbox Code Playgroud)

结果 - > sockfd -1错误:没有错误,错误0


好的,我改为将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);
}
Run Code Online (Sandbox Code Playgroud)

返回的结果仍然是 - > sockfd -1 socket:没有错误,错误0是否有可能mingw不支持errno?

pax*_*blo 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);
}
Run Code Online (Sandbox Code Playgroud)

我不知道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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

因为您使用的是Windows套接字,所以需要使用WSAGetLastError()函数来检查错误代码.Windows套接字函数不设置errno,这就是为什么你看到errno的值为0.

这个旧的MinGW wiki页面有一个UNIX套接字和Windows套接字之间的差异列表,提到了第5项中的errno vs WSAGetLastError()差异:http: //oldwiki.mingw.org/index.php/sockets