socket网络编程学习笔记(socket、bind)

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

一种基于数据报提供伪流数据包的套接字类型。

参数三:协议类型

下表列出了协议的常见值,但也可能有许多其他值。

协议意义

IPPROTO_ICMP

1

互联网控制消息协议 (ICMP)。当 af 参数为 AF_UNSPECAF_INET AF_INET6 并且类型参数为 SOCK_RAW 或未指定时,这是一个可能的值。

IPPROTO_IGMP

2

互联网组管理协议 (IGMP)。当 af 参数为 AF_UNSPECAF_INET AF_INET6 并且类型参数为 SOCK_RAW 或未指定时,这是一个可能的值。

BTHPROTO_RFCOMM

3

蓝牙射频通信(Bluetooth RFCOMM)协议。当  af参数为 AF_BTH 并且类型参数为 SOCK_STREAM 时,这是一个可能的值。

IPPROTO_TCP

6

传输控制协议(TCP)。当 af 参数为 AF_INET 或 AF_INET6 并且类型参数为 SOCK_STREAM 时,这是一个可能的值。

IPPROTO_UDP

17

用户数据报协议 (UDP)。当 af 参数为 AF_INET 或 AF_INET6 并且类型参数为 SOCK_DGRAM 时,这是一个可能的值。

IPPROTO_ICMPV6

58

互联网控制消息协议版本 6 (ICMPv6)。当 af 参数为 AF_UNSPECAF_INET 或 AF_INET6 并且类型参数为 SOCK_RAW 或未指定时,这是一个可能的值。

IPPROTO_RM

113

用于可靠多播的 PGM 协议。当 af 参数为 AF_INET 并且套接字类型参数为 SOCK_RDM 时,这是一个可能的值。

需要注意的是,如果指定值 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来检索特定的错误代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值