c - socket() 返回 -1 但 errno 0

标签 c sockets mingw codeblocks winsock2

我试图在 mingw 上创建一个 UDP 套接字,但是 socket()返回 -1 , 错误号 = 0 .奇怪的。
我已经包含了 winsock2.h。
最初我有编译错误 undefined reference to socket@12 , 设置后-lws2_32-lwsock32到 Code::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);
}

结果-->
socks -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);
}

返回的结果仍然是 --> sockfd -1 socket: No error , errno 0
mingw 有可能不支持 errno 吗??

最佳答案

我要做的第一件事是:

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;
}

关于c - socket() 返回 -1 但 errno 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962531/

相关文章:

java - Java中线程完成时关闭资源

compiler-errors - 使用SDL和g++编译找不到-lSDLmain等

c++ - 包括在 Qt 项目上使用 CMake 和 Gnu 时出现的问题

cygwin - Windows-7 上的 Linux 开发 C/C++/bash/python

c - 释放非堆内存

c - C 代码中的语法错误

java - 套接字编程 - BindException - 地址已被使用

c - C语言中的Vigenere Square解密

c - 我需要将许多函数中使用的全局变量设置为本地变量

c - 使用C中的套接字通过TCP发送音频文件