快捷搜索: 王者荣耀 脱发

socket编程 套接字编程 (纯理论)

基本概念

套接字——应用层和传输层之间,提供应用传输接口

Web/RPC/中间件——应用层之上的网络开发

应用编程接口API(application programming interface)

套接字接口(socket interface)简称套接字,是一种API。

socket API

一个进程可能会创建多个套接字,不同的进程会创建自己的套接字。

当客户端创建套接字希望与服务端进行通信时,通过端口号来分辨与服务端的哪一个应用进程进行通信(为什么不通过IP地址进行分辨,因为服务端主机上有多个应用进程在运行,每个应用进程可能会使用多个套接字。单单通过IP地址不足以分辨出是与哪一个套接字进行通信)

套接字对内对外使用的管理机制不同

标识通信端点(对外)——IP地址+端口号——这是针对TCP/IP的

操作系统/进程如何管理套接字(对内)——套接字描述符(socket description)

一个进程创建一个套接字的时候,会返回一个套接字描述符。操作系统在管理内部套接字的时候,都是通过套接字描述符来引用的(操作系统使用套接字描述符来管理套接字的时候, 就是一种套接字抽象机制,这种抽象机制类似于文件的抽象。Unix操作系统对于套接字管理和文件管理,是一个管理,也就是说他把套接字看成是一个特殊的文件;Windows操作系统是分开管理的。)。

socket API函数

1、socket函数——创建套接字

调用socket函数成功之后,会返回一个套接字描述符(sd)

socket函数的三个参数:

1)、Protofamily)(协议族)——用于说明我的套接字面向哪种协议

2)、tyep(套接字类型)

3)、proto(协议号)

值为0代表用的是默认协议

例子——创建流套接字代码段

2、closesocket函数——关闭连接(Unix中的函数名是close,没有socket,记住)

3、bind函数——为套接字设置本地端点地址信息(即IP地址+端口号)

熟知端口号——web服务器就是80,sftp是25,以此类推

客户端一般不必调用bind函数

如果服务器有多个网卡,也就是有多个IP地址,该如何处理,绑定哪一个IP地址呢——使用地址IP体制通配符 INADDR_ANY

4、listen函数——服务端监听状态

5、connect函数——客户端

6、accept函数

当服务器调用accept,取走客户端的连接请求之后,就会创建新的套接字。真正与客户端创建连接的,就是这个新套接字。

7、send,sendto函数——用于发送数据

8、recv、recvfrom函数——用于接受数据

9、setsockopt、getsockopt——套接字参数设置和套接字参数读取

套接字面向TCP/IP可以创建的服务类型

应用层要通信,就要创建套接字。套接字假期了应用层和传输层的一个接口。

如果我创建的套接字的面向TCP的,就是流式套接字;如果是面向UDP而创建的套接字,就是数据报套接字;如果是直接面向网络层的套接字,则是原始套接字。

网络应用中Socket API(TCP)调用的基本流程

客户端软件的设计

1、解析各个功能函数

2、TCP客户端软件流程

3、UDP客户端软件流程

经验分享 程序员 微信小程序 职场和发展