首页 > 编程语言 >C++将WSAGetLastError转换成字符串信息

C++将WSAGetLastError转换成字符串信息

时间:2023-07-14 17:23:37浏览次数:39  
标签:转换成 FORMAT 错误代码 errorMessage C++ FormatMessageA MESSAGE WSAGetLastError

#include <iostream>
#include <Windows.h>
#include <WinSock2.h>

std::string GetLastErrorMessage() {
    DWORD errorCode = WSAGetLastError();
    LPSTR errorMessage = nullptr;

    DWORD result = FormatMessageA(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPSTR)&errorMessage, 0, NULL);

    if (result == 0) {
        return "Failed to get error message";
    }

    std::string errorMessageStr(errorMessage);
    LocalFree(errorMessage);

    return errorMessageStr;
}

int main() {
    // 在此进行Winsock初始化

    // 进行网络操作,发生错误时获取错误信息
    int result = /* Your network operation */;
    if (result == SOCKET_ERROR) {
        std::string errorMessage = GetLastErrorMessage();
        std::cout << "Error: " << errorMessage << std::endl;
    }

    // 清理Winsock资源

    return 0;
}

在上述示例中,我们定义了一个GetLastErrorMessage()函数,该函数使用FormatMessageA()函数将错误代码转换为字符串信息。首先,我们调用WSAGetLastError()获取最后一次错误的错误代码。然后,我们使用FormatMessageA()函数来将错误代码转换为相应的错误消息字符串。

请注意,我们在FormatMessageA()函数的dwFlags参数中设置了一些标志,包括FORMAT_MESSAGE_FROM_SYSTEM表示从系统中获取错误消息,FORMAT_MESSAGE_IGNORE_INSERTS表示忽略任何插入参数。我们还使用了MAKELANGID()宏来确定错误消息的语言。

在应用程序的主体逻辑中,当发生网络操作错误时,我们可以调用GetLastErrorMessage()函数来获取错误消息,并相应地处理错误情况。

请注意,上述示例假设你已经初始化了Winsock并进行了必要的网络操作。确保在使用WSAGetLastError()获取错误代码之前,你已经进行了相应的网络操作。

标签:转换成,FORMAT,错误代码,errorMessage,C++,FormatMessageA,MESSAGE,WSAGetLastError
From: https://www.cnblogs.com/c9080/p/17554540.html

相关文章

  • c++学习之extern C
    g++也可以编译c语言函数,1//filename:extern_c.cc23#include<iostream>45#ifdef__cplusplus6extern"C"{7#endif8//c语言语句开始9#include<stdio.h>1011intcmain(){12printf("hello");13return0;14}1......
  • C++面试八股文:什么是构造函数?
    C++面试八股文:什么是构造函数?某日二师兄参加XXX科技公司的C++工程师开发岗位第29面:面试官:什么是构造函数?二师兄:构造函数是一种特殊的成员函数,用于创建和初始化类的对象。构造函数的名称与类的名称相同,并且没有返回类型。构造函数在对象被创建时自动调用。structFoo{F......
  • c++ 段错误(核心已转储)
    一、什么是段错误?段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。二、段错误产生的原因1、访问不存在的内存地址#include<iostream>#include<algorithm>#include<vector>#include<stdio.h>#include<st......
  • C#使用泛型方法将Datatable转换成List对象集合
     在项目中遇到需要将Datatable转换成对象的需求,通过dr[0]取下标这种获取,如果数据的顺序发生了改变则需要改变全部,工作量大foreach(DataRowdrindt.Rows){CheckDetailinfo=newCheckDetail();info.org_id=dr[0].ToStrin......
  • C++ 文件和流
     到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到C++中另一个标准库 fstream,它定义了三个新的数据类型:数据类型描述ofstream该数据类......
  • C++ STL容器之vector、list
    (1)vector连续存储的容器,动态数组,在堆上分配空间底层实现:数组扩容机制:vector增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始......
  • 现代C++(Modern C++)基本用法实践:一、类型推导
    概述类型推导主要是依赖auto关键字和decltype关键字/运算符实现的,具体用法参考下面的例子。二者特点:auto用于声明时推导遍历decltype用于推导各种表达式,decltype(var)中var也是一种称为变量表达式的表达式二者都是在编译时进行推导。引用类型推断:decltype推断变量类型时......
  • 现代C++(Modern C++)基本用法实践:五、智能指针(Smart Pointers)
    概述c++效率较高的一个原因是我们可以自己定制策略手动申请和释放内存,当然,也伴随着开发效率降低和内存泄漏的风险。为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,有三种:std::unique_ptr是一种独占所有权的智能指针,它不允许多个指针指向同一个对......
  • 现代C++(Modern C++)基本用法实践:四、模板
    概述C++的模板是泛型编程思想的一种实现。C++是强类型语言,处处强调类型。同样的加法运算,int和float的加法运算需定义两个函数(重载),而使用模板则可以只用一个函数(见下面示例)。这类似我们面向对象所说的多态(定义加法运算,各个类型有不同的实现),所以是所谓静多态的一种实现方式,不同的......
  • 现代C++(Modern C++)基本用法实践:三、移动语义
    概述移动移动(move)语义C++引入了一种新的内存优化,以避免不必要的拷贝。在构造或者赋值的时候,如果实参是右值(或者左值由std::move转换成右值),便会匹配移动语义的函数调用如下述举例的Str(Str&&obj)。移动语义的本质是将资源(内存/句柄)转移给另一个对象,被转移资源的对象不应再被使......