c++ socket编程初学笔记

1.类型

1.WSADATA

WSADATA: WSAData功能是:存放windows socket初始化信息
struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYSSTATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
};

wVersion为你将使用的Winsock版本号,
wHighVersion为载入的Winsock动态库支持的最高版本,注意,它们的高字节代表次版本,低字节代表主版本。
szDescription与szSystemStatus由特定版本的Winsock设置,实际上没有太大用处。
iMaxSockets表示最大数量的并发Sockets,其值依赖于可使用的硬件资源。
iMaxUdpDg表示数据报的最大长度;然而,获取数据报的最大长度,你需要使用WSAEnumProtocols对协议进行查询。
最大数量的并发Sockets并不是什么神奇的数字,它是由可用的物理资源来决定的.
lpVendorInfo是为Winsock实现而保留的制造商信息,这个在Windows平台上并没有什么用处

2.WORD

WORD是(typedef unsigned short WORD)16位,正好是两个BYTE

3.DWORD

Double WORD, 每个WORD两个字节,DWORD四个字节

4.SOCKET

int socket(int af, int type, int protocol);
4.1 af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。AF 是“Address Family”的简写,INET是“Inetnet”的简写。AF_INET 表示 IPv4 地址。
4.2 type 为数据传输方式,常用的有 SOCK_STREAM(面向连接传输) 和 SOCK_DGRAM(无连接传输)
4.3 protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议

5.sockaddr_in

struct sockaddr_in{
sa_family_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
5.1 sin_family 和 socket() 的第一个参数的含义相同,取值也要保持一致。
5.2 sin_prot是端口号。uint16_t 的长度为两个字节,理论上端口号的取值范围为 0~65536,但 0~1023 的端口一般由系统分配给特定的服务程序,例如 Web 服务的端口号为 80,FTP 服务的端口号为 21,所以我们的程序要尽量在 1024~65536 之间分配端口号。

6.fd_set

typedef struct fd_set {
u_int fd_count;
SOCKET fd_array[FD_SETSIZE];
} **fd_set, FD_SET, PFD_SET, LPFD_SET;
fd_set结构由各种 Windows 套接字函数和服务提供商(如 select 函数)用于将套接字放入“集”,以便出于各种目的
6.1 fd_count: 集中的套接字数。
6.2 fd_array[FD_SETSIZE]: 集中的套接字数组。

7.FD_ZERO

8.FD_SET

9.FD_ISSET

10.FD_CLR

FD_ZERO(&fdset); 将set清零使集合中不含任何fd,清空fdset与所有文件句柄的联系
FD_SET(fd, &fdset); 将fd加入set集合,建立文件句柄fd与fdset的联系
FD_CLR(fd, &fdset); 将fd从set集合中清除,清除文件句柄fd与fdset的联系
FD_ISSET(fd, &fdset); 在调用select()函数后,用FD_ISSET来检测fd是否在set集合中,当检测到fd在set中则返回真,否则,返回假
以上式子中的fd为socket句柄。

2.函数

1.WSAStartup

int WSAAPI WSAStartup(
[in] WORD wVersionRequested,
[out] LPWSADATA lpWSAData
);
参数:
1.1 [in] wVersionRequested
调用方可以使用的最高版本的 Windows 套接字规范。 高顺序字节指定次要版本号;低顺序字节指定主版本号。
1.2 [out] lpWSAData
返回值:
指向 WSADATA 数据结构的指针,该结构用于接收 Windows 套接字实现的详细信息。
若成功,返回0;不成功,返回错误代码

2.bind

int bind(
[in] SOCKET s,
const sockaddr *addr,
[in] int namelen
);
参数:
2.1 [in] s: 标识未绑定套接字的描述符。
2.2 addr: 指向要分配给绑定套接字的本地地址的 sockaddr 结构的指针。
2.3 [in] namelen: 名称参数指向的值的长度(以字节为单位)。
返回值:
若未发生错误,返回0;若发生错误,返回错误代码

3.listen

int WSAAPI listen(
[in] SOCKET s,
[in] int backlog
);
参数:
3.1 [in] s: 标识绑定的未连接套接字的描述符。
3.2 [in] backlog: 挂起连接队列的最大长度。
返回值:
未发生错误返回0,发生错误返回错误代码

4.select(利用select实现并发)

int WSAAPI select(
[in] int nfds,
[in, out] fd_set *readfds,
[in, out] fd_set *writefds,
[in, out] fd_set *exceptfds,
[in] const timeval *timeout
);
参数:
4.1 [in] nfds: 已忽略。 仅包含 nfds 参数,以便与 Berkeley 套接字兼容。
4.2 [in, out] readfds: 一个可选指针,指向一组要检查的套接字是否可读。
4.3 [in, out] writefds: 一个可选指针,指向要检查的一组套接字是否可写。
4.4 [in, out] exceptfds: 指向一组要检查错误的套接字的可选指针。
4.5 [in] timeout: 选择等待的最大时间,以 TIMEVAL 结构的形式提供。 将 超时 参数设置为 null 以阻止操作。
返回值:
select 函数返回已准备就绪且包含在fd_set结构中的套接字句柄总数、时间限制过期时为零;如果发生错误,则返回SOCKET_ERROR。

5.accept

SOCKET WSAAPI accept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] int *addrlen
);
参数:
5.1 [in] s
一个描述符,用于标识已使用listen函数处于侦听状态的套接字。 连接实际上是使用 接受返回的套接字建立的。
5.2 [out] addr
指向接收连接实体地址(称为通信层)的缓冲区的可选指针。 添加器参数的确切格式由创建 sockaddr 结构中的套接字时建立的地址系列确定。
5.3 [in, out] addrlen
指向包含 addr 参数指向的结构长度的整数的可选指针。
返回值:
如果未发生错误, 则 accept 将返回一个类型为 SOCKET 的值,该值是新套接字的描述符。 此返回的值是实际连接的套接字的句柄。
否则,返回 INVALID_SOCKET 值,可以通过调用 WSAGetLastError 来检索特定的错误代码。

6.recv

int recv(
[in] SOCKET s,
[out] char *buf,
[in] int len,
[in] int flags
);
参数:
6.1 [in] s: 标识连接的套接字的描述符。
6.2 [out] buf: 指向用于接收传入数据的缓冲区的指针。
6.3 [in] len: buf 参数指向的缓冲区的长度(以字节为单位)。
6.4 [in] flags: 一组影响此函数行为的标志。 请参阅下面的备注。 有关此参数可能值的详细信息,请参阅“备注”部分。
返回值:
如果未发生错误, recv 将返回收到的字节数, buf 参数指向的缓冲区将包含接收的此数据。 如果连接已正常关闭,则返回值为零。

7.WSAGetLastError

int WSAAPI WSAGetLastError();
返回值
指示此线程最后一次失败的 Windows 套接字操作的错误代码。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值