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

5 篇文章 0 订阅

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

系统环境: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两种套接字地址信息结构体的内部结构和使用方法
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以按照以下步骤配置Visual Studio(VS)来学习TCP/IP网络编程: 1. 安装Visual Studio:首先,确保你已经在计算机上安装了Visual Studio。你可以从官方网站(https://visualstudio.microsoft.com/)下载并安装最新版本的Visual Studio。 2. 创建新的项目:打开Visual Studio后,选择“创建新项目”选项。在项目模板中,选择适合你的编程语言(如C++、C#等)和平台(如Windows、Linux等)。 3. 配置项目属性:在项目创建后,右键点击项目名称,选择“属性”选项。在属性窗口中,找到“配置属性”和“链接器”选项。在这里,你可以设置包含库文件、头文件路径以及其他必要的编译选项。 4. 添加必要的库文件:根据你所选择的编程语言和平台,添加TCP/IP网络编程所需的库文件。例如,在C++中,你可能需要添加Winsock库文件(如ws2_32.lib)。 5. 编写网络编程代码:使用所选的编程语言编写TCP/IP网络编程代码。你可以参考相关的文档、教程或书籍来学习如何使用套接字(Socket)API、网络协议等进行网络编程。 6. 编译和运行代码:完成代码编写后,点击Visual Studio的“生成”按钮进行代码编译。如果没有错误或警告,你可以运行生成的可执行文件来测试你的网络编程应用程序。 以上是一个基本的配置过程,具体步骤可能会因你的编程语言、平台和具体需求而有所不同。建议你参考相关的网络编程教程和文档,以便更深入地学习和理解TCP/IP网络编程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值