socket函数
功能
创建一个套接字
语法
SOCKET WSAAPI socket(
int af,
int type,
int protocol
);
参数一:地址类型
目前支持的值是 AF_INET 或 AF_INET6,它们分别代表 IPv4 和 IPv6 的 Internet 地址类型格式。如果安装了适用于特定地址类型的 Windows Sockets 服务提供程序,还支持其他的地址类型选项。
参数二:套接字类型(数据传递方式)
下表列出了 Windows Sockets 2 支持的类型参数的可能值:
类型 | 意义 |
---|---|
SOCK_STREAM 1 | 一种套接字类型,通过 OOB 数据传输机制提供有序、可靠、双向、基于连接的字节流。此套接字类型使用传输控制协议 (TCP)作为 Internet 地址家族(AF_INET 或 AF_INET6)。 |
SOCK_DGRAM 2 | 支持数据报的套接字类型,数据报是具有固定(通常很小)最大长度的无连接、不可靠的缓冲区。此套接字类型使用用户数据报协议 (UDP)作为 Internet 地址家族(AF_INET 或 AF_INET6)。 |
SOCK_RAW 3 | 一种套接字类型,提供原始套接字,允许应用程序操作下一个上层协议标头。要操作 IPv4 标头,必须在套接字上设置IP_HDRINCL套接字选项。要操作 IPv6 标头,必须在套接字上设置 IPV6_HDRINCL套接字选项。 |
SOCK_RDM 4 | 提供可靠消息数据报的套接字类型。这种类型的一个示例是 Windows 中的实用通用多播 (PGM) 多播协议实现,通常称为可靠多播编程。 仅当安装了可靠多播协议时才支持此类型值。 |
SOCK_SEQPACKET 5 | 一种基于数据报提供伪流数据包的套接字类型。 |
参数三:协议类型
下表列出了协议的常见值,但也可能有许多其他值。
需要注意的是,如果指定值 0,即未指定协议类型,将由服务提供商选择要使用的协议。
返回值
如果没有发生错误,socket 将返回引用新套接字的描述符。否则,返回 INVALID_SOCKET,并可用 WSAGetLastError 函数(检索最近一次调用的函数的错误码)检索特定的错误代码。
bind函数
功能
将具体的地址、端口号与 socket 关联。
语法
int WSAAPI bind(
SOCKET s,
const sockaddr *name,
int namelen
);
参数一:套接字的描述符
标识未绑定的套接字描述符,即使用 socket 函数创建的套接字。
参数二:sockaddr 结构体指针
指向要分配给绑定套接字的本地地址的 sockaddr 结构体指针,sockaddr 的结构如下:
struct sockaddr {
ushort sa_family;
char sa_data[14];
} SOCKADDR;
struct sockaddr_in {
short sin_family; // 地址类型
u_short sin_port; // 端口号
struct in_addr sin_addr; // 地址
char sin_zero[8]; //
} SOCKADDR_IN;
其中,sockaddr 与 sockaddr_in 所占内存大小均为 16 字节,但是在 sockaddr 中 IP 地址与端口号共同存储在一个字符串数组中,而在 sockaddr_in 中 IP 地址与端口号分开存储。因此,为了便于操作,在使用 sockaddr 结构体存储 IP 地址与端口号前,应使用 sockaddr_in 结构体进行存储,随后通过强制类型转换,得到 sockaddr 结构体。e.g.
SOCKADDR_IN service;
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);
//----------------------
// Bind the socket.
iResult = bind(ListenSocket, (SOCKADDR *) &service, sizeof (service));
端口查询
查看被使用的所有端口:在 cmd 运行 netstat -ano
查看要使用的端口号是否被占用:在 cmd 运行 netstat -ano|findstr "待查端口号"
IP 地址
127.0.0.1 :本地回环地址,用于本地测试
in_addr 结构体
in_addr (winsock2.h) - Win32 apps | Microsoft Learn
其他事项
在 VS2019 中,若要使用 inet_addr 函数,需加入如下语句
#pragma warning(disable:4996)
参数三:名称参数指向的值的长度
即参数二的类型大小(以字节为单位)。
返回值
如果未发生错误,将返回零。否则,它返回 SOCKET_ERROR,值为 -1,可以通过调用 WSAGetLastError来检索特定的错误代码。