请看这个简单的程序
#include <stdio.h>
#include <string.h>
#include <errno.h>
int
main (void)
{
printf ("ERROR %d %s\n", ETIMEDOUT, strerror (ETIMEDOUT));
return 0;
}
如果您使用Cygwin gcc编译它,它可以正常运行。
$ gcc a.c
$ ./a
ERROR 116 Connection timed out
如果您使用MinGW-w64 gcc编译它,它将不能给出正确的错误信息。
$ i686-w64-mingw32-gcc a.c
$ ./a
ERROR 138 Unknown error
我该如何使MinGW-w64输出正确的错误信息?
ETIMEDOUT
的一些额外细节:我的至少一个 MinGW 安装将其定义为10060
(与WSAETIMEDOUT
相同),而不是138
,如果它尚未定义。我认为这是因为传统的winsock.h
曾经这样做(但现在不再这样做)。如果编译器的cerrno
没有定义它,Boost 将把它定义为9938
- 这直到 VS2010 才开始在 MSVC 中发生。所以,我想说你可能会觉得自己很幸运,甚至可以编译程序。 - Michael Burr