C 套接字()返回-1,但错误号为0
我试图在mingw上创建一个UDP套接字,但是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
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;
}