首页 > 编程知识 正文

accept函数的返回值(linux accept过程,accept()函数 Unix/Linux)

时间:2023-05-03 10:53:48 阅读:123642 作者:4780

名字

accept -在连接插座中接受

个人资料

#包含

#包含

intaccept(intsockfd,struct sockaddr *addr,socklen_t *addrlen );

说明

accept (系统调用用于基于连接的套接字类型(SOCK_STREAM,sock _ seq包)。 提取连接队列中的第一个连接请求,创建新的连接套接字,并返回指向该套接字的新文件描述符。 新创建的套接字处于监听状态。 原始套接字sockfd不接受此调用。

参数sockfd的套接字绑定到本地地址bind(2) socket),并在创建侦听连接后变为listen(2) 2。

参数addr是指向结构sockaddr。 嵌入在该结构中的对等套接字的地址用作已知的通信层。 地址由套接字地址系列以addr的准确格式返回。 请参阅套接字(2)和相应协议的手册页。

addrlen参数是值结果参数。 它最初包含大小addr指向的结构,并包含在返回函数时返回实际长度(以字节为单位)的地址。 如果addr未填写为NULL。

如果没有挂起的连接队列,并且未将其标记为无阻塞套接字,则accept ()将被阻止直到建立连接。 如果套接字标记为无块且没有未完成的连接队列,则accept ()将失败,并生成错误EAGAIN。

要通知传入连接位于套接字上,请使用select(2)或orpoll(2) 2。 在尝试新连接后,通过调用accept (获取套接字时,将传递可读事件。 也可以将套接字提供的SIGIO活动设置为在套接字上发生。 详情请参照插座(7)。

如果DECNET对特定协议(accept ) )只能视为从队列中检索以下连接请求,必须明确确认这不意味着确认: 确认能够正常读取和写入新的文件描述符,暗示暗示和排斥反应,通过关闭新的套接字可以暗示。 目前,只有DECNet具有这种Linux上的意义。

注意

SIGIO传递select(2)或poll(2)可能并不一定会等待连接被删除并返回称为异步网络错误或另一个线程接受)的可读事件。 在这种情况下,调用将被阻止,直到下一个连接到达。

要确保accept ()未被阻止,必须在套接字sockfd上设置O_NONBLOCK标志。 socket )7)。

返回值

如果成功,则accept ) )返回非负整数。 这接受套接字描述符。 如果发生错误,则返回-1,并正确设置错误。

错误处理

Linux上的accept ()传递挂起的网络错误,传递新的socket accept ) )错误代码。 此行为与其他BSD套接字实现不同。 可靠的APP应用程序必须检测到网络错误定义协议,然后重试,例如accept ()或EAGAIN。 在这些情况下,TCP/IP来自ENETDOWN ENOPROTOOPT EPROTO、EHOSTDOWN、ENONET、EHOSTUNREACH、EOPNOTSUPP和ENETUNREACH。

错误

accept ()可能会失败到以下:

标签

说明

EAGAINorEWOULDBLOCK

thesocketismarkednon-blockingandnoconnectionsarepresenttobeaccepted。

欧洲足球锦标赛

The descriptor is invalid。

ECONNABORTED

a连接has been aborted。

输入输出

thesystemcallwasinterruptedbyasignalthatwascaughtbeforeavalidconnectionarrived。

EINVAL

socketisnotlisteningforconnections,oraddrlenisinvalid(e.g .is negative )。

Em文件

the per-processlimitofopenfiledescriptorshasbeenreached。

性能文件

thesystemlimitonthetotalnumberofopenfileshasbeenreached。

电子商务

the描述符参考a file,not a socket。

EOPNOTSUPP

thereferencedsocketisnotoftypesock _ stream。

accept ()可能会失败,如下所示:

标签

说明

电子故障

theaddrargumentisnotinawritablepartoftheuseraddresspace。

ENOBUFS,ENOMEM

notenoughfreememory.thisoftenmeansthatthememoryallocationislimitedbythesocketbufferlimits,not by the system memory。

电子产品

协议错误器。

Linuxaccept ()可能会失败,如下所示:

标签

说明

电子邮件地址

防火墙规则结构连接。

此外,还可能返回由新套接字的协议定义的网络错误。 各种Linux内核可以返回其他错误,如ENOSR ESOCKTNOSUPPORT和EPROTONOSUPPORT ETIMEDOUT。 跟踪过程中可能会显示值ERESTARTSYS。

听从命令

SVR 4,4.4 BSD (接受) )第一个应用程序in 4.2 BSD )。

注意

首先,声明accept ()为“”“‘int *”的第三个参数(许多其他系统,如libc4、libc5和4.x BSD、SunOS 4上、SGI等); 下一个POSIX.1g标准案我想更改它,变成' size_t* ',那是什么? 在SunOS5上。 此后,POSIX汇票“socklen_t*”就是这样针对单个Unix标准和glibc2进行的。

中选择所需的墙类型

我给你奖励

纠错/补充

藏品

QQ群啦,加上易百教程官方技术学习群

注:建议每个候选人在自己的技术方向上添加一个组。 建议在同一QQ中最多添加三个组。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。