鄙人水平浅薄,如有错误,欢迎大神指正
系统环境:Windows10 64位
开发环境:VisualStudio2015
PS:关于本文提供的winsock套接字API,是针对win操作系统的,但是大部分API对于linux系统一样适用,可能部分类型win系统进行了typedef类型申明(比如socket函数创建套接字时,win返回的是typedef后的SOCKET,linux返回的是int,实质上返回的都是无符号整型数据,移植到linux时需要注意),windows平台下使用winsock需要使用(一)中提供的初始化和释放资源API,linux不需要,可以直接略过。
头文件:#include<WinSock2.h>
一、初始化、释放资源
1.函数:int WSAStartup(WORD wVersionRequested , LPWSADATA lpWSAData);
功能:初始化WinSock,检查系统是否可用WindowsSockets库
参数:wVersionRequestedWinSock版本号(两个字节,高位副版本,低位主板本)
lpWSAData对应WinSock的信息
返回值:成功0,失败非0
PS:windows平台下使用winsock进行套接字编程前,必须使用该函数进行初始化,否则会调用API失败
2.函数:int WSACleanup()
功能:停止使用WinSock库,释放对应资源
参数:无
返回值:成功0,失败非0
PS:使用winsock结束后调用,对应WSAStartup函数
二、套接字
1.函数:SOCKET socket(int af , int type , int protocol)
功能:创建一个套接字
参数:af 创建套接字指定的协议地址族,TCP或是UDP使用AF_INET即可
type 套接字协议类型(TCP:SOCK_STREAM,UDP:SOCK_DGRAM,原是套接字:SOCK_RAW)
protocol 套接字使用的特定协议,默认0将根据前两个参数自动设置
返回值:创建成功,返回一个无符号的整型数据,失败INVALID_SOCKET
PS:对应Linux系统下,返回值类型是int,其实都是无符号整型
2.函数:int shutdown(SOCKET s , int how)
功能:停止套接字的接收、发送功能
参数:s 需要关闭的套接字标识符
how 关闭哪些功能(0禁止接收,1禁止发送,2禁制接收发送)
返回:成功0,失败SOCKET_ERROR
PS:只是关闭发送接收功能,并没有释放套接字占用的资源
3.函数:int closesocket(SOCKET s)
功能:关闭套接字,释放资源
参数:s 需要释放资源的套接字标识符
返回:成功0,失败SOCKET_ERROR
PS:释放资源,如果套接字的队列中还没有发送出去的数据,会根据setsockopt函数设定的套接字状态进行处理
4.函数:int bind(SOCKET s , const struct sockaddr *name , int namelen)
功能:将套接字与本地地址信息进行绑定
参数:s 进行操作的套接字
name 网络地址信息的结构体
namelen 网络地址信息结构体的长度
返回:成功0,失败SOCKET_ERROR
PS:bind函数只应用于服务器端;
const struct sockaddr这个结构体,是通用的套接字地址结构体,TCP/IP协议体系下使用const struct sockaddr_in进行代替,二者的内存占用一样,使用时只须将sockaddr_in进行类型强转即可,两个结构体的内部信息后面有详细介绍;
5.函数:int listen(SOCKET s , int backlog)
功能:设定套接字为侦听状态,准备接收客户机进程发送来的连接请求
参数:s 负责侦听的套接字标识符
backlog 允许等待连接的队列最大长度
返回:成功0,失败SOCKET_ERROR
PS: listen函数只应用于服务器端
只针对面向连接的套接字,即TCP协议;
6.函数:int connect(SOCKET s , const struct sockaddr *name , int namelen)
功能:向服务器提出连接请求
参数:s 设定建立连接的套接字标识
name 通信对方(服务器)的网络地址信息结构体
namelen 网络地址信息结构体的长度
返回:成功0,失败SOCKET_ERROR
PS:const sturct sockaddr与bind函数里的使用方法一样
7.函数:SOCKET accept(SOCKET s , const struct sockaddr * addr , int *addrlen)
功能:接收客户端进程connect函数发送的连接请求
参数: s 侦听状态的套接字(listen函数的套接字)
addr 存放客户端IP地址信息的结构体的指针
addrlen addr的长度
返回:成功返回建立连接的套接字标识,失败返回INVALID_SOCKET
三、传输API
1.函数:int recv(SOCKET s , char *buf , int len , int flags)
功能:通过已建立连接的套接字,接收数据
参数:s 已建立连接的套接字
buf 存储客户端进程发送来的数据缓冲区
len 缓冲区长度
flags 操作方式(0正常数据,MSG_PEED系统缓冲区的数据复制到所提供的接收缓冲区内,系统缓冲区数据未删除,MSG_OOB处理带外数据,通常用参数0即可)
返回:成功返回接收到的数据长度,连接结束返回0,失败返回SOCKET_ERROR
2.函数:send(SOCKET s , const char *buf , int len , int flags)
功能:通过已建立连接的套接字,发送数据
参数:s 已建立连接的套接字标识符
buf 待发送数据的缓冲区
len 缓冲区数据长度
flags 传输方式(0正常方式,MSG_DONTROUTE目标主机就在本地网中,MSG_OOB带外数据发送)
返回:成功返回发送的数据长度,连接结束返回0,失败返回SOCKET_ERROR
backlog 允许等待连接的队列最大长度
下一篇详解
网络字节序、主机字节序区别和相互转换的API
以及
struct sockaddr与struct sockaddr_in两种套接字地址信息结构体的内部结构和使用方法