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 库函数 – strerror()

gai_strerror函数

C/C++ Linux 出错处理函数(strerror 与 perror)

C/C++ Linux 出错处理函数(strerror 与 perror)

linux 中的errno 和 strerror(errno)

字符串库函数及重点函数的模拟实现下篇--- strstr + strtok + strerror