包含文件

用于 Windows 套接字 1.1 的原始包含文件是 Winsock.h 头文件。 为了轻松地将基于 Berkeley UNIX 套接字的现有源代码移植到 Windows 套接字,建议为 Winsock 1.1 提供 Windows Sockets 开发工具包,其中包含名称与标准 UNIX 包含文件相同的多个包含文件(例如,sys/socket.h 和 arpa/inet.h 头文件)。 但是,这些名称类似的 Winsock 头文件仅包括包含 Winsock2.h 头文件的指令。

当 Windows 套接字 2 发布时,用于 Windows 套接字的主要包含文件已重命名为 Winsock2.h。 Winsock 1.1 的较旧原始 Winsock.h 头文件也保留,以便与旧应用程序兼容。 自 Windows 2000 发布以来,Winsock 1.1 兼容应用程序的开发已弃用。 现在,所有应用程序都应在 Winsock 应用程序源文件中使用包含 Winsock2.h 指令。

Winsock2.h 头文件包含大多数 Winsock 函数、结构和定义。 Ws2tcpip.h 头文件包含用于 TCP/IP 的 WinSock 2 协议特定附件文档中引入的定义,其中包含用于检索 IP 地址的较新函数和结构。 其中包括 getaddrinfo getnameinfo 系列函数,这些函数为 IPv4 或 IPv6 地址提供名称解析。 仅当应用程序需要这些与 IP 无关的命名函数时,才需要 Ws2tcpip.h 头文件。

Mswsock.h 头文件包含用于 Microsoft 特定 Windows 套接字 2 扩展的定义(例如,TransmitFileAcceptExConnectEx)。 除非应用程序使用这些 Microsoft 特定扩展,否则通常不需要 Mswsock.h 头文件。

Winsock2.h 头文件在内部包含 Windows.h 头文件中的核心元素,因此 Winsock 应用程序中的 Windows.h 头文件通常没有 #include 行。 如果 Windows.h 头文件需要 #include 行,则它应在 #define WIN32_LEAN_AND_MEAN 宏前面。 出于历史原因,Windows.h 头默认包含 Windows Sockets 1.1 的 Winsock.h 头文件。 Winsock.h 头文件中的声明将与 Windows Sockets 2 所需的 Winsock2.h 头文件中的声明冲突。 WIN32_LEAN_AND_MEAN 宏可防止 Windows.h 标头包含 Winsock.h。 阐述此内容的示例图如下所示。

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

int main() {
  return 0;
}

创建基本 Winsock 应用程序

Winsock 入门

将套接字应用程序移植到 Winsock

Winsock 编程注意事项