【计算机网络】网络编程接口 Socket API 解读(1)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。
本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具,和其他平台(比如 os-x 及不同版本会有些出入)。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。
一.socket()
遵循 POSIX.1 - 2001、POSIX.1-2008、4.4BSD
1.库
标准 c 库,libc, -lc
2.头文件
<sys/socket.h>
3.接口定义
int socket(int domain, int type, int protocol);
4.接口描述
创建一个通信端点(endpoint,通信的每一端都可以成为一个 endpoint),返回指向该端点的文件描述符。socket() 是所有其他操作的前提,比如创建了 socket,才能进一步的设置以及使用网络。
5.参数
- domain
socket 的网络协议簇,通常包括:AF_INET ipv4 网络协议AF_INET6 ipv6 网络协议(有时也会兼容 ipv4)AF_UNIX 本地socket,也就是我们常说的 domain socket
- type
SOCK_STREAM (TCP)有序、可靠、双向的基于连接的字节流,可选支持带外数据传输SOCK_DGRAM (UDP)数据报文传输,非连接的、不可靠的、有固定最大长度SOCK_SEQPACKET (不粘包的 TCP)有序、可靠、双向具有最大数据报长度的传输SOCK_RAW 提供原始网络协议访问SOCK_RDM 提供可靠的数据报传输层,但是不保证报文顺序
注意:有些类型可能协议簇未实现
带外数据传输指的是 TCP 在紧急情况下通过调整报文在发送/接收缓冲区的位置以及数据包中添加紧急标记的逻辑。
- protocol
指定具体的传输协议,比如 IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP,在netinet/in.h 中定义
6.返回值
发生错误时返回 -1,设置 errno 指示错误码,否则返回一个新创建的整型文件描述符。
可能的错误码包括:
错误码 | 含义 |
EACCES | 没有权限创建对应的 socket |
EAFNOSUPPORT | 实现不支持指定的 AF_ 地址家族 |
EINVAL | 未知的协议或者地址家族不可用 |
EINVAL | type 参数不合法 |
EMFILE | 进程文件描述符到达最大限制 |
ENFILE | 系统文件描述符到达上限 |
ENOBUFS or ENOMEM | 内存不足 |
EPROTONOSUPPORT | domain 不支持指定的协议类型 |
二、bind
遵循 POSIX.1-2008
1.库
标准 c 库,libc, -lc
2.头文件
<sys/socket.h>
3.接口定义
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
4.接口描述
通过 socket() 接口创建 socket 后,socket 只存在于名字空间中,并没有实际的地址分配给它。bind 接口将 addr 指定的 IP 地址分配给由文件描述符 sockfd 指定的 socket。addrlen 指定了 addr 指针指向的地址结构的字节长度。以前我们将这个操作给 socket 分配名字。
通常在 TCP_STREAM socket 接收连接前需要将一个本地地址通过 bind 分配给 socket。
名字绑定规则随着地址家族的不同而不同。
addr 的数据结构也是随着地址家族的变化而变化的。sockaddr 结构的定义类似:
struct sockaddr {sa_family_t sa_family;char sa_data[14];}
这个结构定义主要是为了防止编译器报错,主要是将各种地址结构做一个强制转换。
5. 返回值
发生错误时返回 -1,设置 errno 指示错误码,否则返回一个新创建的整型文件描述符。
可能的错误码包括:
错误码 | 含义 |
EACCES | 地址是保护地址,并且用户不是超级用户 |
EADDRINUSE | 指定的地址已经使用 |
EADDRINUSE | 对于 domain socket,端口号在地址结构体中 指定为 0,但在尝试 bind 到临时端口时,临时端口没有空闲的了 |
EBADF | sockfd 不是可用的文件描述符 |
EINVAL | socket 已经绑定到了一个地址 |
EINVAL | addrlen 错误,或者 addr 不是一个可用的 domain 地址 |
ENOTSOCK | 文件描述符没有指向任何 socket |
UNIX domain(AF_UNIX) 特定的错误码 | |
EACCESS | 在路径前缀下无搜索权限 |
EADDRNOTAVAIL | 请求的接口不存在或者不是本地的接口 |
EFAULT | addr 指向了用户无法访问的地址空间 |
ELOOP | 解析地址时遇到了太多的符号链接 |
ENAMETOOLONG | 地址太长 |
ENOENT | 指定路径不存在 |
ENOMEM | 内核内存不足 |
ENOTDIR | 路径前缀不是一个目录 |
EROFS | socket inode 位于只读文件系统中 |
6.示例代码
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#define MY_SOCK_PATH "/somepath"#define LISTEN_BACKLOG 50#define handle_error(msg) \do { perror(msg); exit(EXIT_FAILURE); } while (0)intmain(void){int sfd, cfd;socklen_t peer_addr_size;struct sockaddr_un my_addr, peer_addr;sfd = socket(AF_UNIX, SOCK_STREAM, 0);if (sfd == -1)handle_error("socket");memset(&my_addr, 0, sizeof(my_addr));my_addr.sun_family = AF_UNIX;strncpy(my_addr.sun_path, MY_SOCK_PATH,sizeof(my_addr.sun_path) - 1);if (bind(sfd, (struct sockaddr *) &my_addr,sizeof(my_addr)) == -1)handle_error("bind");if (listen(sfd, LISTEN_BACKLOG) == -1)handle_error("listen");/* Now we can accept incoming connections oneat a time using accept(2). */peer_addr_size = sizeof(peer_addr);cfd = accept(sfd, (struct sockaddr *) &peer_addr,&peer_addr_size);if (cfd == -1)handle_error("accept");/* Code to deal with incoming connection(s)... */if (close(sfd) == -1)handle_error("close");if (unlink(MY_SOCK_PATH) == -1)handle_error("unlink");}
三、accept
1.库
标准 c 库,libc, -lc
2.头文件
<sys/socket.h>
3.接口定义
int accept(int sockfd, struct sockaddr *_Nullable restrict addr,socklen_t *_Nullable restrict addrlen);#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <sys/socket.h>int accept4(int sockfd, struct sockaddr *_Nullable restrict addr,socklen_t *_Nullable restrict addrlen, int flags);
4.接口描述
accept 系统调用用于面向连接的 socket (SOCK_STREAM、SOCK_SEQPACKET),它会从监听的 socket(sockfd)的等待连接队列里拿到第一个连接请求,创建一个新的连接的 socket,并返回一个新的文件描述指向这个新的 socket。新创建的 socket 并没有处于监听状态,原来的 socket(sockfd)并不会受到任何影响。
sockfd 是由 sockect() 创建的,并通过 bind 绑定到了本地地址上,并通过 listen 监听连接。
addr 是一个指向 sockaddr 结构的指针,这个地址由对端 socket 的地址填充。而返回的 addr 的结构类型根据 socket 地址家族的不同而不同。当 addr 是 NULL 时,底层并不会对其填充,这种情况下 addrlen 也没有用,也应该是 NULL。
addrlen 参数是一个输入输出参数,调用者必须使用 addr 指向的结构体的大小来初始化它,而在返回时,则会使用对端地址的实际大小来填充。
如果提供的 buffer 太小,则返回的地址将会被截断,这种情况下,addrlen 会返回一个比提供值大的值。
如果当前等待连接队列中没有待连接请求,并且 socket 没有被设置成非阻塞,那么 accept() 将会一直阻塞。如果 socket 设置为非阻塞,那么 accept() 将报错为 EAGAIN 或者 EWOULDBLOCK。
为了获取 socket 上有连接请求过来,我们需要使用 select、poll、epoll。当一个新连接来临时,会产生一个可读事件,我们可以使用 accept 来继续从连接上获取一个 socket。
我们也可以设置 socket 上有连接时发送 SIGIO 信号。
如果 flag 是 0,那么 accept4() 就等同于 accept()。flag 可以是下面配置的或起来的值,来实现不同的行为:
- SOCK_NONBLOCK
设置新文件描述符的 O_NONBLOCK 属性
- SOCK_CLOEXEC
设置新文件描述符的 FD_CLEXEC 属性。
5.返回值
成功时,返回一个新接收的 socket 的文件描述符(非负值)。
出错时,返回 -1,设置 errno 为错误码,addrlen 不会被修改。
- 错误处理
Linux 的 accept() 会将既存的网络错误也会给返回值,这个行为和其他 BSD socket 实现的行为不太一样。为了可靠性,我们应该处理 accept 返回网络错误,这些错误是和协议相关的。比如 EAGAIN 表示重传,在TCP/IP 的场景下,还有 ENETDOWN、 EPROTO、 ENOPROTOOPT, EHOSTDOWN、 ENONET、 EHOSTUNREACH、 EOPNOTSUPP、 ENETUNREACH等需要处理。
可能的错误码包括:
错误码 | 含义 |
EAGAIN或EWOULDBLOCK | socket 设置为非阻塞,目前没有可用连接。POSIX.1-2001 和 POSIX.1-2008 允许范围任何一个错误,同时并没有他们有相同的值,所以为了实现移植性,需要分别判断。 |
ECONNABORTED | 连接已中断 |
EFAULT | addr 不是用户地址空间可写的地址 |
EBADF | sockfd 不是打开的文件描述符 |
EINVAL | socket 没有在监听连接或者addrlen不合法 |
EINVAL | accept4,flags 值不合法 |
ENOTSOCK | 文件描述符没有指向任何 socket |
EINTR | 在连接到达前,系统调用被信号打断 |
EMFILE | 进程描述符数达到上限 |
EFAULT | addr 指向了用户无法访问的地址空间 |
ENFILE | 系统文件描述符达到上限 |
ENAMETOOLONG | 地址太长 |
ENOENT | 指定路径不存在 |
ENOMEM或ENOBUFS | 内核内存不足 |
EOPNOTSUPP | socket 不 SOCK_STREAM 类型 |
EPERM | 防火墙禁止连接 |
EPROTO | 协议错误 |
Linux 上,新创建的 socket 并不会从监听 socket 上继承 O_NONBLOCK 和 O_AYSNC 属性,这点和 canonical BSD socket 实现的行为不同。所以,实现可移植的程序不应该依赖这些行为。
值得注意的是,有时在我们收到 SIGIO 或者通过select、poll、epoll 获得到一个刻度的事件时,并不一定就会有一个连接等待连接,这是因为连接很可能会被异步网络错误或者其他线程通过 accept() 拿走了。在这种情况下,就会导致 accept 阻塞,直到下一个连接到达。为了保证 accept 永远不会阻塞,传来的 socketfd 需要有 O_NONBLOCK 属性。
在最初的 BSD socket 实现中,accept 的第三个参数是 int *,在 POSIX.1g 草稿版标准想把它改成 size_t *C,后来 POSIX 标准和glibc 2.x 定为 socket_t *。
遵循:
accept() POSIX.1-2008
accept4 Linux
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
【计算机网络】网络编程接口 Socket API 解读(1)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具,和其他平台(比如 os-x …...
![](https://img-blog.csdnimg.cn/img_convert/e3a7b645763c46cff3f12a000a11789d.png)
IGES在线查看与转换
IGES 格式最初由美国空军开发并于 1980 年发布。该格式是集成计算机辅助制造 (ICAM) 项目的产品,该项目旨在通过集成操作来降低制造成本。 IGES 文件旨在允许航空航天相关设计在不同平台上传输,同时将数据丢失降至最低。 在 IGES 格式出现之前,不同公司创建的 CAD 和计算机…...
![](https://www.ngui.cc/images/no-images.jpg)
【Vue3-Vite】Vite配置--路径别名配置
路径别名配置 使用 代替 src Vite配置 // vite.config.ts import {defineConfig} from vite import vue from vitejs/plugin-vueimport path from pathexport default defineConfig({plugins: [vue()],resolve: {alias: {"": path.resolve("./src") // …...
![](https://www.ngui.cc/images/no-images.jpg)
道可云元宇宙每日资讯|第二届世界元宇宙大会将在嘉定安亭举行
道可云元宇宙每日简报(2023年9月6日)讯,今日元宇宙新鲜事有: 第二届世界元宇宙大会将于9月20日在嘉定安亭举行 元起嘉定,虚实相生,产业赋能。由中国仿真学会、中国指挥与控制学会和北京理工大学共同主办&a…...
![](https://img-blog.csdnimg.cn/img_convert/29a696cb37deb70eea3a26ada8871a84.jpeg)
Python for 循环语句
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。 语法: for循环的语法格式如下: for iterating_var in sequence:statements(s) 流程图: 实例 #!/usr/bin/python # -*- coding: UTF-8 -*- for letter in …...
![](https://img-blog.csdnimg.cn/e6fc0c59faf34c5693ccc24de9a45555.gif)
iOS脱壳之frida-ios-dump
frida-ios-dump介绍 该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件,适合现iOS11版本之后的越狱手机使用。 下载 https://github.com/AloneMonkey/frida-ios-dump环境安装 电脑环境安装 win和Mac 环境一样都是…...
![](https://www.ngui.cc/images/no-images.jpg)
rust中的reborrow和NLL
reborrow 我们看下面这段代码 fn main() {let mut num 123;let ref1 &mut num; // 可变引用add(ref1); // 传递给 add 函数println!("{}", ref1); // 再次使用ref1 }fn add(num: &mut i32) {println!("{}", *num); }我们…...
![](https://www.ngui.cc/images/no-images.jpg)
Java设计模式:一、六大设计原则-04:迪米特法则
文章目录 一、定义:迪米特法则二、模拟场景:迪米特法则原则三、违背方案:迪米特法则原则3.1 工程结构3.2 学生、老师、校长类3.2.1 学生类3.2.2 老师类3.2.3 校长类 3.3 单元测试 四、改善代码:迪米特法则原则4.1 工程结构4.2 学生…...
![](https://www.ngui.cc/images/no-images.jpg)
使用docker部署pg数据库
使用 Docker 部署 PostgreSQL 数据库是一种常见的做法,它提供了方便、可移植和可重复的方式来运行数据库。下面是一个简单的示例,用于在 Docker 中部署 PostgreSQL 数据库: 首先,确保您已经安装了 Docker 并正确配置了 Docker 环境…...
![](https://img-blog.csdnimg.cn/ed3e0c02dd004ec88cc0db5fc60019a2.png)
Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南
亚马逊平台是美国最大的一家网络电子商务公司,亚马逊公司是1995年成立,刚开始只做网上书籍售卖业务,后来扩展到了其他产品。现在已经是全世界商品品种最多的网上零售商和第二互联网公司,亚马逊是北美洲、欧洲等地区的主流购物平台…...
![](https://img-blog.csdnimg.cn/7fbd73b070fa47e4960fd05226678c63.png)
springboot封装查询快递物流
目录 一、ApiClient代码解读二、ApiService代码解读三、HomeController代码解读四、整体代码五、结果展示 一、ApiClient代码解读 这是一个简单的Spring Boot的RestTemplate客户端,用于执行HTTP请求。 首先,这个类被Component注解标记,这意味…...
![](https://img-blog.csdnimg.cn/e3edf99de3d64446aa2bdfb94119d859.png)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
目录 1. 特殊类设计 1.1 不能被拷贝的类 1.2 只能在堆上创建的类 1.3 只能在栈上创建的类 1.4 不能被继承的类 1.5 只能创建一个对象的类(单例模式)(重点) 1.5.1 饿汉模式 1.5.2 懒汉模式 2. 类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 d…...
![](https://www.ngui.cc/images/no-images.jpg)
go 使用systray 实现托盘和程序退出
1.先 go get 安装 包 go get github.com/getlantern/systray2.使用的代码 func main() {fmt.Println("开始")systray.Run(onReady, onExit) }func onReady() {systray.SetIcon(icon.Data)systray.SetTitle("Awesome App")systray.SetTooltip("Prett…...
![](https://www.ngui.cc/images/no-images.jpg)
Electron之单例+多窗口
Electron之单例多窗口 Electron 24 React 18 单例可以通过app.requestSingleInstanceLock实现,多窗口可以简单通过路由来实现 单例 const gotTheLock app.requestSingleInstanceLock(); if (!gotTheLock) {app.quit(); } else {app.on(second-instance, (event, …...
![](https://www.ngui.cc/images/no-images.jpg)
A Survey of Knowledge-Enhanced Pre-trained Language Models
本文是LLM系列的文章,针对《A Survey of Knowledge-Enhanced Pre-trained Language Models》的翻译。 知识增强的预训练语言模型综述 摘要1 引言2 背景3 KE-PLMs用于NLU4 KE-PLMs用于NLG5 未来的方向5.1 整合来自同质和异质来源的知识5.2 探索多模态知识5.3 提供可…...
![](https://www.ngui.cc/images/no-images.jpg)
动态规划(选择)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 作为队伍的核心,forever97很受另外两个队友的尊敬。 Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家forever97爱吃的外卖。 如果T…...
![](https://img-blog.csdnimg.cn/b99e588df04b498d9ab54032c4d5e931.png)
IIS WebDAV配置,https绑定及asp设置
IIS支持标准CGI,因此可以用程序语言针对STDIN和STDOUT开发。 IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 IIS支持脚本解释CGI,因此可以用脚本语言针对STDIN和STDOUT开发。 IIS perl python cbrother php脚本语言配置…...
![](https://img-blog.csdnimg.cn/img_convert/e93f089897e877a1528c3f31119e3dcb.png)
【计算机视觉项目实战】中文场景识别
✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨&…...
![](https://www.ngui.cc/images/no-images.jpg)
Java 中 Map 初始化的几种方法
# 传统方式 Map<String, String> map new HashMap<>(); map.put("k1", "v1"); map.put("k2", "v2");# java8新特性-双括号初始化 Map<String, String> map1 new HashMap<>() {{put("k1", "v…...
![](https://www.ngui.cc/images/no-images.jpg)
【学习方法论】学习的三种境界、三种习惯、三个要点,三个心态
学习的三种境界、三种习惯、三个要点,三个心态 三种学习境界 苦学 古人云:“头悬梁、锥刺股”,勤学苦练是第一境界。处于这种层次的同学,觉得学习枯燥无味,对他们来说学习是一种被迫行为,体会不到学习中的…...
![](https://img-blog.csdnimg.cn/a40cb2123dd44bff8c2fafa39ee8a3bf.png)
[管理与领导-67]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 评估你与公司的八字是否相合
目录 前言: 一、概述 二、八字相合的步骤 2.1 企业文化是否相合 2.2.1 企业文化对职业选择的意义 2.2.2 个人与企业三观不合的结果 2.2.3 什么样的企业文化的公司不能加入 2.2 公司的发展前景 2.3 公司所处行业发展 2.4 创始人的三观 2.5 创始人与上司的…...
![](https://img-blog.csdnimg.cn/7a80245f0b5f4021a033b3789a9efdeb.png)
【PMO项目管理】深入了解项目管理 | Stakeholder 利益相关者 | 利益相关者之间的立场差异
💭 写在前面:本文将带您深入了解项目管理的核心概念和关键要素。我们将从项目管理的基本理解开始,逐步探讨其领域、复杂性和变化的重点,以及项目管理的具体过程。我们还将研究项目的性质以及成功项目所必备的条件。在此过程中&…...
![](https://img-blog.csdnimg.cn/img_convert/b8453ddd87ab13666e11c7748005d9e8.png)
设计模式-原则篇-01.开闭原则
简介 可以把设计模式理解为一套比较成熟并且成体系的建筑图纸,经过多次编码检验目前看来使用效果还不错的软件设计方案。适用的场景也比较广泛,在使用具体的设计模式之前先要学习软件设计的基础 “软件设计原则”,后面的23个设计模式都是…...
![](https://img-blog.csdnimg.cn/1421318507a249b1a03fdc070e5729bb.png#pic_center)
JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)
基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能: 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…...
![](https://img-blog.csdnimg.cn/6ac02949f08e4440a6611c80061066ca.png)
windows环境搭建ELK
目录 资源下载(8.9.1) ES安装、注册、使用 Kibana安装、注册、使用 Logstash安装、注册、使用 Filebeat安装、使用(如果只有一个数据流,则不需要使用filebeat,直接上logstash即可) 资源下载࿰…...
![](https://img-blog.csdnimg.cn/81a3417cfff74872819aa04a6842e183.png)
langchain介绍之-Prompt
LangChain 是一个基于语言模型开发应用程序的框架。它使得应用程序具备以下特点:1.数据感知:将语言模型与其他数据源连接起来。2.代理性:允许语言模型与其环境进行交互 LangChain 的主要价值在于:组件:用于处理语言模型…...
![](https://img-blog.csdnimg.cn/5be42e25197c4c62b074eab00fe6b8d6.png)
汇编语言Nasmide编辑软件
用来编写汇编语言源程序,Windows 记事本并不是一个好工具。同时,在命令行编译源程序也令很多人迷糊。毕竟,很多年轻的朋友都是用着 Windows 成长起来的,他们缺少在 DOS和 UNIX 下工作的经历。 我一直想找一个自己中意的汇编语言编…...
![](https://img-blog.csdnimg.cn/img_convert/a4a7d822a816bea6e004d94190876b53.png)
用python开发一个炸金花小游戏
众所周知扑克牌可谓是居家旅行、桌面交友的必备道具, 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则。 炸(诈)金花又叫三张牌,是在全国广泛流传的一种民间多人纸牌游戏…...
![](https://img-blog.csdnimg.cn/ff7805029277461898f3d879967edbc3.png)
Uniapp中使用uQRCode二维码跳转小程序页面
下载插件 uQRCode官网地址 引入插件 文件如下 //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode = {};(functio…...
![](https://img-blog.csdnimg.cn/9cff52f18e36493da36ea37037b17717.png)
解决husky在mac下不生效的问题
目录 一、问题 1.1 问题描述 二、解决 2.1 解决 一、问题 1.1 问题描述 本文主要解决的问题是,husky在windows上正常生肖,但放到mac下后不生效的问题! 为了确保团队中提交代码的一致性,因此使用了 husky 作为提交的检测工具…...
![](https://img-blog.csdnimg.cn/935f5ac492cf483b927d135e290f729a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Iqx55Sf6YWx5ouM6Z2i,size_20,color_FFFFFF,t_70,g_se,x_16)
网站创建流程教程/舆情监控系统
文章目录1.二分查找的基本概念和实现(简单)1.1题目实例1.2解题思路1.3代码实现1.3.1左闭右闭区间1.3.2左闭右开区间2.搜索插入位置(简单)1.1题目实例1.2解题思路1.3代码实现1.3.1左闭右闭区间1.3.2左闭右开区间3.在排序数组中查找元素的第一个和最后一个位置(中等)3…...
![](/images/no-images.jpg)
移动网站建设自助建站/排名优化工具下载
1.discriminator MyBatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为 <resultMap ....> ... <discriminator javaType"java类型" column"数据库某一列"><case value"查询到值" resultType"">…...
![](/images/no-images.jpg)
企业网站seo参考文献/seo排名的公司
Orgrimmar 题意: 就是给你一个树,然后让你选择一些点集,每个点的度<1。问你这个点集最大是多少。 思考: 刚开始我想了个贪心,既然度<1的才能保留,那么我先把度>3的全部删掉,剩下的能…...
![](/images/no-images.jpg)
长春做网站的公司哪家好/怎么自己做一个网页
题目链接 题意:给你n个价格范围l,r,问最后没组价格的上下浮动能不能不超过k 思路:要让价格不超过k,设i的价格范围为L,R那么不超过k那么i1的价格范围就在L-k,Rk这个范围内,为了时他…...
![](https://images2018.cnblogs.com/blog/1224905/201806/1224905-20180629123256456-651105592.png)
通辽做网站制作/目前最好的引流推广方法
在机器学习的过程中,我们经常会遇见过拟合的问题。而输入数据或features的维度过高就是导致过拟合的问题之一。。维度越高,你的数据在每个特征维度上的分布就越稀疏,这对机器学习算法基本都是灾难性的。所有出现了很多降维的方法。今天我们要…...
![](/images/no-images.jpg)
长沙精品网站建设公司/百度号码认证平台官网首页
目录 一、数组Array和集合的区别 二、Java集合 三、Collection接口 四、Set 五、List...