IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> socket编程流程及函数详解 -> 正文阅读

[网络协议]socket编程流程及函数详解

一、创建socket

?????socket就是一个可读、可写、可控制、可关闭的文件描述符(整型数字)

// 函数原型
int socket(int domain, int type, int protocol)

//参数解释
domain:指定系统使用的协议。可以是TCP/IP协议族,也可以是UNIX协议族。分别对应的值为   
        PF_INET(IPv4)/PF_INET6(IPv6)   和   PF_UNIX。
type:  指明了服务的类型,有流服务和数据报服务,分别对应的参数为SOCK_STREAM、SOCK_UGRAM。  
        对于TCP/IP协议族来说,TCP是基于字节流的,因此传输层使用TCP,那么type要设置为. 
        SOCK_STREAM。UDP是基于数据报的协议,因此type的值对应为SOCK_UGRAM。
protocol:表示在前面两个参数的筛选下可以选择的协议,一般值为唯一的迷糊所有情况下,都将此值设置为0,表示默认协议。
return:socket调用成功返回一个socket文件描述符。失败返回-1,并设置errno。

????

二、命名socket

???????创建socket时,指定了使用哪个协议,就说明指定了地址族。但是没有指定该地址族中哪个具体的socket地址。这里我们可以理解,在我们的内核中,分为TCP/IP协议族、UNIX协议族等几大协议族,每个协议族有很多的socket,每个socket由一个具体的地址唯一的标识,当然,每个socket包含了相应(TCP/IP、UNIX协议族下的所有协议服务)。

将一个socketsocket地址绑定,称为给socket命名。在一般的服务器程序中要命名socket。但是客户端一般不需要命名socket,客户端一般采用匿名方式,使用os自动的分配socket地址。

命名socket需要调用函数bind()。

//函数原型
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen)
//参数解释
将my_addr指针指向的socket赋值给sockfd文件描述符,addrlen指的是socket地址的长度。
return: 地址绑定成功返回0,失败返回-1,并设置errno。  
         errno的值可以为EACCES、EADDRINUSE,EACCES表示指定的地址是受保护的地址,只有超     
         级用户可以访问,EADDRINUSE表示此socket地址正在被使用。

注意上述命名过程中最主要的一点是socket的地址,下面详细介绍socket地址的创建。

?

2、1通用的socket地址结构体

struc sockaddr
{
    sa_family_t sa_family;
    char sa_data[14];
}
//sa_data存放的是socket的地址值。
//sa_family_t是地址族类型,sa_family是地址族类型变量。  
//地址族类型要和协议族类型一一对应。
//比如在上述的socket函数中参数domain设定使用TCP/IP协议族中的IPv4对应的PF_INET,那么此处的地址族就要设置为AF_INET。
//可以按照以下的表格进行设置,达到一一对应。
协议族地址族
PF_UNIXAF_UNIX
PF_INETAF_INET
PF_INET6AF_INET6

但是由于像 PF_UNIX的地址长度为108字节, PF_INET的长度为6字节, PF_UNIT6地址的长度为26字节,sa _data无法满足协议地址族的地址值。因此,Linux下创建了新的socket地址结构体。

struc sockaddr_storage
{
    sa_family_t sa_family;
    unsigned long int __ss_align;
    char __ss_padding[128-sizeof(__ss_align)];
}
//这样保证了足够的内存存放地址空间,而且__ss_align保证了内存对齐。

?

2、2专用socket地址

上述的socket结构中只有地址选项,要获取相应的IP地址,要进行相应的位操作。因此Linux建立了专用socket地址,以方便获取IP地址和端口号。
比如IPv4的socket地址结构如下:

struct socketaddr_in
{
     sa_family_t sa_family;      //地址族 IPv4的值为AF_INET
     u_int6_t sin_port;          //端口号,此处要使用网络字节码标识(大端模式)
     struct in_addr sin_addr;    //IPv4地址结构
};   
struct in_addr
{
     u_int32_t s_addr;           //此处要使用网络字节码标识(大端模式)
};   

另外还有对应的IPv6socket地址专用结构,和IPv4的类似,都显示的标识了端口号和IP地址,注意此处的端口号和IP地址都是网络字节码标识,即大端模式。

?

三、监听socket

由于服务器要处理多个客户端的请求,因此不能始终的即使处理,因此要建立一个队列,将连接存储在队列中依次处理。因此就需要始终监听客户端的请求连接,然后合理的处理客户端的请求连接。

//函数原型
int listen(int sockfd,int backlog)
//参数解释
sockfd指定被监听的socket,backlog参数提示内核监听队列的最大长度。标识socket完全连接状态的socket数量,典型值为5.
//listen成功返回0,失败返回-1,并设置errno值。

?

四、接受连接

从监听队列中接收一个连接

//函数原型
int accept(int sockfd,struct sockaddr* addr, socklen_t * addrlen)
//参数解释
sockfd指定被监听过的的socket,addr是获取被接收连接的远端socket地址,addrlen指定了远端socket地址的长度。
//accept成功时返回一个新的连接socket,该socket唯一的标识了被接受的这个连接,服务器可以通过读写这个socket来和客户端进行通信。accept失败返回-1,并设置errno。

?

五、总结

服务端socket编程的一个完整流程:
-> 创建socket(指明要使用的协议,TCP/IP或者UNIX协议,接下来细化TCP、UDP)
->创建一个socket地址(IPv4、IPv6,注意端口号和IP地址要转为网络字节序整数)
->命名socket(将socket和socket地址进行绑定,用到了bind函数)
->socket的监听(对客户端请求的监听,用到了listen函数)
->accept函数接收连接,得到一个新的连接socket,服务器端就可以和远端的客户端进行读写操作。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:24:57  更:2021-08-19 12:25:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:36:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码