ACCEPT()和ACCEPT4()
ACCEPT
章节:Linux 程序员手册 (2)更新:2010-09-10
到 易美翻译 翻译
名字
accept - 通过套接口接受一个连接概要
#include Esys/types.h> /* 参看 “注意小节” */ #include Esys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);#define _GNU_SOURCE /* 参考 feature_test_macros(7) */ #include <sys/socket.h>int accept4(int sockfd, struct sockaddr *addr,socklen_t *addrlen, int flags);
描述
accept() 系统调用应用于可连接套接口类型 ( SOCK_STREAM, SOCK_SEQPACKET)。它取出在监听套接口 sockfd请求队列里的第一个连接,新建一个已连接的套接口,并且返回一个引用该套接口新的文件描述符。新建的套接口不处于监听状态。原始的套接口 sockfd 没有受到影响。参数 sockfd 是一个由 socket(2) 创建的套接口,通过 bind绑定到一个本地地址,并且在调用 listen(2)之后正处于监听之中。
参数 addr 是指向一个 sockaddr结构的指针。这结构体被填充为一个端套接口,又被称为通信层。返回的地址结体 addr的额外的格式可以通过套接口地址族(参看 socket(2)和各自的协议手册页)来确定。当 addr 是 NULL 时,没有内容被填充,此时 addrlen不被使用,同时也可以是 NULL。
参数 addrlen 是一个“值-返回”型参数,调用者必须把它初始化为 addr指向的结构的大小(字节数),返回时,它指出端地址的实际大小。
如果提供的缓冲区太小,返回的地址将被截断,此时,addrlen 将返回一个比传入更大的值。
如果队列里没有未处理的连接,并且套接口没有标记为不阻塞,accept()会阻塞当前调用进程直到有一个连接出现。如果没有未处理的连接,同时套接口被标记为不阻塞,accept() 返回EAGAIN 或 EWOULDBLOCK 错误。
为了在一个套接口有连接时收到通知,你可以使用 select(2) 或 poll(2)。当有连接时,一个可读事件被递送。进一步,你可以设置当一个套接口可用时,发送一个SIGIO,参看 socket(7)来详细了解。
对于一些需要显示验证的协议,比如说 DECNet,accept()只是从队列里取出连接请求,并没有执行验证。验证将在下次对新建的文件描述符进行正常的读或写时进行,并且拒绝可以通过关闭那个新建的套接口来进行。目前在Linux 中只有 DECNet 有如此语义。
flags 是 0,那么 accept4() 与 accept() 功能一样。下面flags 的值可能通过位求或运算来得到不同的行为:
- SOCK_NONBLOCK
- 在新打开的文件描述符设置 O_NONBLOCK 标记。在 fcntl(2) 中保存这个标记可以得到相同的效果。 SOCK_CLOEXEC
- 在新打开的文件描述符里设置 close-on-exec (FD_CLOEXEC) 标记。参看在open(2) 里关于 O_CLOEXEC标记的描述来了解这为什么有用。
返回值
成功时,这个系统调用返回一个非负整数的文件描述符来代表接受的套接口。错误时,返回 -1,并把 errno设置为合适的值。错误处理
在 Linux 里, accept() (和 accept4()) 把本属于accept() 的但未处理的网络错误传递给新建的套接口。 这个行为不同于其它 BSD 的实现。 可靠的应用应该在调用 accept() 之后检测相应协议可能的网络错误,并且处理 EAGAIN 一样重试一次。对于 TCP/IP来说,这些错误有 ENETDOWN、 EPROTO、 ENOPROTOOPT、 EHOSTDOWN、 ENONET、 EHOSTUNREACH、 EOPNOTSUPP和 ENETUNREACH。错误
- EAGAIN 或 EWOULDBLOCK
- 套接口被标记为非阻塞并且没有连接等待接受。POSIX.1-2001允许在此时返回这两种错误,但没有要求两个常量必须具有相同的值,所以可移植的程序应该同时检查两者。 EBADF
- 描述符无效。 ECONNABORTED
- 一个连接已经中止了。 EFAULT
- 参数 addr 不在可写的用户地址空间里。 EINTR
- 在一个有效的连接到达之前,本系统调用被信号中断,参看 signal(7)。 EINVAL
- 套接口不在监听连接,或 addrlen 无效(如是负数)。 EINVAL
- (accept4()) 在 flags 中有无效的值。 EMFILE
- 达到单个进程打开的文件描述上限。 ENFILE
- 达到系统允许打开文件个数的全局上限。 ENOBUFS, ENOMEM
- 没有足够的自由内存。这通常是指套接口内存分配被限制,而不是指系统内存不足。 ENOTSOCK
- 描述符是一个文件,不是一个套接字。 EOPNOTSUPP
- 引用的套接口不是 SOCK_STREAM 类型的。 EPROTO
- 协议错误。
此外,Linux 下的 accept() 可能因如下原因失败:
- EPERM
- 防火墙规则禁止连接。
还有,新建套接口和协议相关的网络错误也可能被返回。多种 Linux 内核还会返回诸如ENOSR、ESOCKTNOSUPPORT、EPROTONOSUPPORT、ETIMEDOUT的错误。ERESTARTSYS 的值也可能需要关注。
版本
accept4() 系统调用从 Linux 2.6.28 开始支持,glibc 在版本 2.10 开始支持。遵循于
accept():POSIX.1-2001, SVr4, 4.4BSD, ( accept() 首次出现在4.2BSD)。accept4() 是非标准 Linux 扩展。
在 Linux 系统里,accept() 返回的新建的套接口 不会 继承监听套接口的诸如O_NONBLOCK 和 O_ASYNC 这样的文件状态。这个行为与正规的 BSD套接口实现不一致。可移植的程序不应该假设文件状态是继承或不继承的,总是显示地设置 accept()返回的套接口需要的标记位。
注意
POSIX.1-2001 不要求包含 <sys/types.h>,并且这个头文件在 Linux中也不要求。然而一些历史(BSD)实现要求这个头文件,可移植的应用程序应该包含这个文件。在 SIGIO 递送之后,在 select(2) 或 poll(2) 返回但连接却因为一个异步网络错误而删除之后,或在其它线程调用accept() 之前,不需要总是等待。如果这些事发生了,调用将被阻塞到一个新连接到来,为了让accept() 绝不阻塞,传入的 sockfd 需要设置 O_NONBLOCK 标记(参看socket(7))。
socklen_t 类型
accept() 的第三个参数最初被声明为 int* (在 libc4 和 libc5,以及一些诸如4.x BSD、SunOS4、SGI)。POSIX.1g 草案想把它改为 size_t *,这与SunOS 5是一样的,接着 POSIX 草案提出了 socklen_t *,并且在 Single UnixSpecification 和 glibc2 也是如此。Linus Torvalds 曾说:“任何合理的库都必须保证 socklen_t 与 int 有相同的长度。否则的话都会与 BSD 套接口不同。POSIX 最初把它定义 为 size_t ,而我(同时也希望其他人,但显然不是太多)对他们表示强烈的不赞同。把它定义为 size_t将是完全地不兼容,尤其在 64 位系统里,size_t 很少跟 int 有相同的宽度。它 必须 与 int有相同的宽度,因为 BSD 接口是这样的。无论如何,制定 POSIX 的人还是创造出 socklen_t了。他们最初不应该去碰这个东西,但是一旦他们碰了,变会因为一些深奥的原因提供一个命名的类型(可能有些人因为之前愚笨的行为而丢脸时,就会静悄悄地他们的行为换个名字)。”
示例
参考 bind(2)。参看
bind(2), connect(2), listen(2), select(2), socket(2), socket(7)
英文原版:http://man7.org/linux/man-pages/dir_all_alphabetic.html
相关文章:

没有提示_华为手机发出莫名的提示音,打开什么也没有?原来是它们在作怪
不知道你们有没有遇到过这样的情况,在使用手机的过程中会出现一个非常奇怪的现象:当你听到手机发出声音,打开手机却发现什么通知也没有?这一度让我感到很困扰,本着“打破砂锅问到底”的精神,终于让我找到了…

近段时间佛我就偶尔无
jo建瓯市金佛玩手机欧力紧凑度 我株型紧凑我阿九倨傲四局李嘉诚转载于:https://juejin.im/post/5b8e5263e51d4538e2278c9b

php内核探索方法与资源
PHP内核探索 TIPI深入理解PHP内核 风雪之隅PHP源码分析 《php扩展开发及内核应用》 百度XLQ Gods blog codinglabsPHP内核探索:从SAPI接口开始PHP内核探索:一次请求的开始与结束PHP内核探索:一次请求生命周期PHP内核探索:单进程SA…

feign调用走不走网关全局拦截_feign服务端出异常客户端处理的方法
在使用feign进行远程方法调用时,如果远程服务端方法出现异常,客户端有时需要捕获,并且把异常信息返回给前端,而如果在开启熔断之后,这个异常会被消化,所以说,如果希望拿到服务端异常,…

配置Cesium编译环境
1、安装node.js https://nodejs.org/en/ 2、配置node.js 在node.js安装目录下新建node_global、node_cache两个文件夹,并把node_global添加到环境变量 eg.D:\app\nodejs npm config set prefix D:\app\nodejs\node_global npm config set cache D:\app\nodejs\node_…

迷你世界电锯机器人_迷你世界:三分钟制作超简单飞翔石像机器人报道!
更多游戏资讯,请点击上方蓝字查询!哈喽,大家好,还记得我之前分享的超简单的石像机器人吗?不记得了吗?我再帮助大家回忆回忆,之前研游酱分享的石像机器人总共是分两篇文章,一个是不会…

J2EE 第二阶段项目之编写代码(四)
我的任务就是项目统计。 1 效益统计 1 教育效益统计表 (教育效益统计表,增,改,查看,查) 2 农牧林效益统计表 (农牧林效益统计表,增,改,查看,查) 3…

PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】
一:Mcrypt简介 Mcrypt是PHP的一个扩展,完成了常用加密算法的封装。其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA…

Javascript到PHP加密通讯的简单实现
互联网上大多数网站,用户的数据都是以明文形式直接提交到后端CGI,服务器之间的访问也大都是明文传输,这样可被一些别有用心之人通过一些手段监听到。对安全性要求较高的网站,比如银行和大型企业等都会使用HTTPS对通讯过程进行加密…

MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
2019独角兽企业重金招聘Python工程师标准>>> 1.新建用户 //登录MYSQL >mysql -u root -p >密码 //创建用户 mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,jeecn’,pa…

uml具有多种视图_UML建模与架构文档化
UML(统一建模语言) 是用元模型描述的,元模型是4层元模型体系结构模式中的一层。此模式的其他层次分别是元-元模型层、模型层和用户对象层。在原模型层,UML元模型 又被分解为三个子逻辑包:基础包(核心、扩展机制和数据模型)、行为元素包(描述模…

insert into与insert ignore以及replace into的区别
insert ignore表示,如果表中已经存在相同的记录,则忽略当前新数据; INSERT INTO有无数据都插入,如果主键则不插入; REPLACE INTO 如果是主键插入则会替换以前的数据; 例 1.insert语句一次可以插入多组值,每组值用一对…

德国SNS交友/视频网站Poppen.de的技术架构分享
Poppen.de是一个德国的 交友/ 聊天/ 视频 的SNS网站, 部分内容NSFW,网站采用了很多我们熟悉的技术,像Nginx ,MySQL,CouchDB,Erlang,Memcached的,RabbitMQ(消息服务器),采用了Graphit…

对数函数定义域和值域_呆哥数学每日一题 —— 复合函数值域
如果想要获取往期每日一题电子版,可以加我微信:daigemath366,备注:知乎 每日一题呆哥解析:这是一个函数和复合函数的综合问题首先我们先把原函数的值域求出来先直接求导:导数不容易判断单调性,我…

一些常用工具地址,随时更新中~
2019独角兽企业重金招聘Python工程师标准>>> 一些常用工具地址的备份: 一款比较全的先到化界面编辑器Neditor:https://gitee.com/notadd/neditor 前端ui组件库,类似element ui。iView:https://www.iviewui.com &#…

UNIX环境编程
linux函数分析查询工具1.优先推荐linux 中man命令2.一个不错的中文Linux手册:http://cpp.ezbty.org/manpage3.在线查英文Man手册:http://www.kernel.org/doc/man-pages/http://man7.org/linux/man-pages/dir_all_alphabetic.htmlhttp://linux.about.com/…

WCF优化的几个常规思路
前几天用WCF做项目时发现了一个效率问题,由于系统对效率要求较高,困扰了很长时间终于将问题解决了,写下来为以后的兄弟们参考,第一次写博客有不准确的地方还望同行们多喷多指点,先行谢过啦... 问题场景是这样的&#x…

使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?
Excel中,我们经常会使用复选框来打勾打叉,这是复选框最基本的功能,相信很多小伙伴都会,但今天我跟大家分享的是复选框的其他操作技巧,勾选复选框变色,统计人数。下图中,我们要利用复选框是否打钩…
[短文速读] 重载有暗坑,JVM是如何执行方法的
前言 这将是一个系列文章。原因是自己写了很多文章,也看了很多文章。从最开始的仅仅充当学习笔记,到现在认认真真去写文章去分享。中间发现了很多事情,其中最大发现是:收藏不看!总是想着先收藏以后有时间再看ÿ…

一笔画问题【数据结构-图论】
回家路上听到2个人在说:田字怎么一笔写成,并且笔划不重复。 田 我回家想了许久,觉得无论如何走正常的途径肯定是不行的,投机取巧脑筋急转弯的我不讨论。 那么是否可以找到数学定理? 其实就是欧拉七桥问题:1…

解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析
一. 前言Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别。本篇就以BeanFactory基础容器接口的默认实现类XmlBeanFactory启动流程分析来入门Spring源码的学习。二. 概念要点1. 概念定义Be…

安装多个gcc
删除gcc #yum remove gcc 安装最新的 #yum install gcc 查找gcc源 可先通过“yum list compat-gcc*”查看版本,然后再利用“yum install compat-gccXXX”安装 #yum list compat-gcc* #sudo yum install compat-gcc-34.i686 查看gcc版本 #gcc -v #gcc34 -v参考&…

JAVA - HashMap和HashTable
1. HashMap 1) hashmap的数据结构 Hashmap本质就是一个数组,只是当key值重复时,使用链表的方式来存储重复的key值(拉链法),注意:链表中存放的仍然是key值。如下图示: 当我们往hashmap中put元素…

empress和queen区别_queen与empress
(1)「queen」和「empress」不仅可以用来指称「king」和「emperor」的妻子,也能指代握有正式权力的女性君主。(2) 英国的君主(queen或king)之所以曾经有过empress或emperor的头衔,是因为英国曾统治过印度次大陆, 他们曾是印度的empress或emperor。如今&am…

在UIWindow上加类似于“回到顶部”的按钮
在公司上个版本的开发中遇到了一个UI布局的小问题: 某个页面需要增加一个分享按钮,但是该页面是二级页面,导航栏右边也已经放置了2个button。 起初和老大谈论这个问题的时候想到的方法是导航栏右边加三个button得了~但是一回想,这…

修改mysql 默认字符集 , 默认引擎
cd /var/lib/mysql/gamell vim db.optdefault-character-setutf8default-collationutf8_general_ciwq service mysqld restart或者service mysqld reload默认字符集修改完毕vim /etc/my.cnf[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sockusermysqldefault-stor…

bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有。然而今天做了这道分块的题才发现分块的暴力之美(如果我空间没有开小就更美了) 我们先将整个…

Linux0.01内核根目录Makefile注释
# # Makefile for linux. # If you dont have -mstring-insns in your gcc (and nobody but me has :-) # remove them from the CFLAGS defines. ## #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码 # AS86 as -0 -a CC86 cc -0 LD86 ld -0# #G…

快速滚动_方老师教滚动快速作文
五年级第一单元作文集阴沉天空中有一小束照着你的阳光。亲爱的孩子,让时间在知识的枝条上、智慧的绿叶上、成熟的果实上留下它勤奋的印痕!罗婉汀作文集自律且努力,别让生活太安逸。亲爱的孩子,耕耘者最信得过自己的汗水࿰…

liunx复制备份命令,copy命令,liunx命令
2019独角兽企业重金招聘Python工程师标准>>> 拷贝到的文件夹 /usr/local/文件夹/需要拷贝的路径文件夹 /usr/local/tomcat/webapps/文件夹/复制命令cp -r /usr/local/文件夹/ /usr/local/tomcat/webapps/文件夹/ 转载于:https://my.oschina.net/u/2336787/blog/635…