【C++】Winsock套接字编程(TCP/IP协议体系)常用API

来源:互联网 发布:淘宝已经收货申请退款 编辑:程序博客网 时间:2024/06/05 15:08

鄙人水平浅薄,如有错误,欢迎大神指正

系统环境: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


下一篇详解
网络字节序、主机字节序区别和相互转换的API
以及
struct sockaddr与struct sockaddr_in两种套接字地址信息结构体的内部结构和使用方法
0 0
原创粉丝点击