Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 套接字()返回-1,但错误号为0_C_Sockets_Mingw_Codeblocks_Winsock2 - Fatal编程技术网

C 套接字()返回-1,但错误号为0

C 套接字()返回-1,但错误号为0,c,sockets,mingw,codeblocks,winsock2,C,Sockets,Mingw,Codeblocks,Winsock2,我试图在mingw上创建一个UDP套接字,但是socket()返回-1,errno=0。奇怪。 我已经包括了winsock2.h。 最初我有编译错误未定义的对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(kER

我试图在mingw上创建一个UDP套接字,但是
socket()
返回
-1
,errno=
0
。奇怪。 我已经包括了winsock2.h。 最初我有编译错误
未定义的对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);
}
sockfd=socket(AF_INET,SOCK_DGRAM,0);
RDF_日志(kDEBUG,“sockfd%d”,sockfd);
if(sockfd<0){
RDF_日志(kERROR,“错误:%s,错误号%d\n”,strerror(错误号),错误号);
}
结果--> 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);
}
inttmp=0;
sockfd=插座(AF_INET,SOCK_DGRAM,0);
tmp=errno;
fprintf(标准“sockfd%d”,sockfd);
if(sockfd<0){
fprintf(标准,“套接字:%s,错误号%d\n”,strerror(tmp),tmp);
}
返回的结果仍然是,-->sockfd-1 socket:No error,errno 0
mingw是否可能不支持errno???

函数/macro
RDF_LOG
可能正在调用C运行时库中正在将
errno
重置为0的其他函数。您需要在
socket
失败后立即捕获
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);
}

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

这个旧的MinGW wiki页面列出了UNIX套接字和Windows套接字之间的差异,并在第5项中提到了errno与WSAGetLastError()的差异:
在另一个答案中没有提到这一点,但上面的代码还有另一个问题。Winsock套接字描述符是socket类型,在我的MinGW winsock2.h中定义为unsigned int

如果假设Winsock套接字的类型与Unix文件描述符类似,则检查负错误返回状态可能会导致错误报告,因为Winsock不保证套接字描述符值将映射为正有符号整数值

返回套接字描述符(socket()、accept()等)的Winsock函数在错误时返回socket_INVALID,错误定义为(socket)~0。如上所述,然后应该使用WSAGetLastError()获取系统错误号


请注意,标准库函数不允许将
errno
设置为零,最佳实践规定第三方库函数也应避免这样做。@paxdiablo是的,我没有初始化winsock!现在它在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;
}