简介

  • windows平台下C++编程常用函数笔记

C++ WSAGetLastError()函数 详解

WSAGetLastError() 是用于在 Windows Sockets API (也称为 WinSock) 中获取上一次操作的错误代码的函数。它与标准 C 库中的 GetLastError() 类似,但专门用于处理与网络相关的错误。

在调用 WinSock 函数时,某些操作可能会失败,而这些函数通常会返回一个特殊的值(例如 SOCKET_ERRORINVALID_SOCKET),以指示操作没有成功。在这种情况下,WSAGetLastError() 用于检索详细的错误代码,以帮助开发人员诊断问题。

函数定义

1
int WSAGetLastError(void);
  • 返回值:返回上一次失败的 WinSock 函数调用的错误代码。

使用场景

  1. 错误处理:当调用诸如 socket(), bind(), connect(), send(), recv() 等网络函数时,如果返回值指示失败,您可以立即调用 WSAGetLastError() 来获取更详细的错误信息。

  2. 排查问题:通过返回的错误代码,可以判断是什么原因导致操作失败,比如网络不可达、连接超时、权限不足等。

常见错误代码

以下是一些常见的错误代码及其含义:

  • WSAEACCES (10013):权限被拒绝。可能是由于防火墙或权限问题。
  • WSAEADDRINUSE (10048):地址已在使用中。尝试绑定一个已经被占用的端口。
  • WSAEADDRNOTAVAIL (10049):指定的地址无效,无法连接到指定的 IP 地址。
  • WSAENETDOWN (10050):网络子系统已失败。
  • WSAENETUNREACH (10051):网络无法到达。通常表示无法访问远程主机的网络。
  • WSAECONNABORTED (10053):软件导致的连接中止。通常是由于超时或其他问题导致连接中断。
  • WSAECONNRESET (10054):远程主机强行关闭连接。
  • WSAETIMEDOUT (10060):连接尝试超时。

示例代码

下面是一个简单的使用 WSAGetLastError() 的示例,展示如何处理网络函数失败时的错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <winsock2.h>
#include <iostream>

#pragma comment(lib, "ws2_32.lib") // 链接 winsock 库

int main() {
    // 初始化 WinSock 库
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cout << "WSAStartup failed with error: " << WSAGetLastError() << std::endl;
        return 1;
    }

    // 创建一个套接字
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) {
        std::cout << "Socket creation failed with error: " << WSAGetLastError() << std::endl;
        WSACleanup();
        return 1;
    }

    // 使用 socket 执行其他网络操作,如 bind() 或 connect()
    // 如果操作失败,可以立即调用 WSAGetLastError() 进行错误处理

    // 关闭 socket
    closesocket(s);

    // 清理 WinSock 库
    WSACleanup();
    return 0;
}

注意事项

  • 只获取最近的错误WSAGetLastError() 只会返回最近一次失败的 WinSock 操作的错误代码。因此,它需要在失败操作后立即调用,延迟调用可能导致错误信息被覆盖。
  • 线程安全WSAGetLastError() 是线程安全的,每个线程都有自己的错误代码,不会与其他线程冲突。

通过 WSAGetLastError(),你可以获取到更加精确的错误信息,以便进行有效的网络调试和处理。