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?
我要做的第一件事是:
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