hstrerror() 的替换函数
Posted
技术标签:
【中文标题】hstrerror() 的替换函数【英文标题】:replacement function for hstrerror() 【发布时间】:2019-07-21 23:01:37 【问题描述】:我正在将一个 linux 套接字库转换为 windows,但 winsock 没有 hstrerror()
函数。 hstrerror()
将采用 h_errno
并吐出一个错误字符串。我认为类似于strerror。我环顾四周,但实际上没有人说用什么代替它。除了“已弃用,请改用getaddrinfo()
或getnameinfo()
”,我没有发现任何关于hstrerror 被替换的内容。具体来说,我有一个使用它的异常类。代码如下:
//
// class socket_h_error
// subclass to record status of extern int h_errno variable
//
class socket_h_error : public socket_error
public:
int host_errno;
//TODO: replace hstrerror()
explicit socket_h_error(const string& what) :
socket_error(what + ": " + hstrerror(h_errno)),
host_errno(h_errno)
;
我确实必须替换 strerror()
,但我没有看到有人提到它可能会替换 hstrerror()
。它在 winsock2 库中也不存在,所以我没有任何来自 MS 的建议。
【问题讨论】:
【参考方案1】:使用WSAGetLastError() 和FormatMessage()。
WSAGetLastError() 在 MSDN 中所有与 winsock 相关的函数中都有明确提及。
【讨论】:
我正在尝试这个:string s = ""; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, herrno, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&s, 0, NULL);
它看起来超级不靠谱,但目前正在编译。
使用了一个字符,所以我没有投射。之后转换为字符串。以上是关于hstrerror() 的替换函数的主要内容,如果未能解决你的问题,请参考以下文章
C/C++ Linux 出错处理函数(strerror 与 perror)
C/C++ Linux 出错处理函数(strerror 与 perror)