socket编程之accept()函数
名称
accept()
接收⼀个套接字中已建⽴的连接
139编辑器使⽤格式
永胜城
#include <>
#include <sys/socket.h>
义利观int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
功能参数描述
accept()系统调⽤主要⽤在基于连接的套接字类型,⽐如SOCK_STREAM和SOCK_SEQPACKET。它提取出所监听套接字的等待连接队列中第⼀个连接请求,创建⼀个新的套接字,并返回指向该套接字的⽂件描述符。新建⽴的套接字不在监听状态,原来所监听的套接字也不受该系统调⽤的影响。
弱的反义词
备注:新建⽴的套接字准备发送nd()和接收数据recv()。
参数:
sockfd, 利⽤系统调⽤socket()建⽴的套接字描述符,通过bind()绑定到⼀个本地地址(⼀般为服务器的套接字),并且通过listen()⼀直在监听连接;
addr, 指向struct sockaddr的指针,该结构⽤通讯层服务器对等套接字的地址(⼀般为客户端地址)填写,返回地址addr的确切格式由套接字的地址类别(⽐如TCP或UDP)决定;若addr为NULL,没有有效地址填写,这种情况下,addrlen也不使⽤,应该置为NULL;
备注:addr是个指向局部数据结构sockaddr_in的指针,这就是要求接⼊的信息本地的套接字(地址和指针)。
addrlen, ⼀个值结果参数,调⽤函数必须初始化为包含addr所指向结构⼤⼩的数值,函数返回时包含对等地址(⼀般为服务器地址)的实际数值;芝麻核桃仁
备注:addrlen是个局部整形变量,设置为sizeof(struct sockaddr_in)。
如果队列中没有等待的连接,套接字也没有被标记为Non-blocking,accept()会阻塞调⽤函数直到连接出现;如果套接字被标记为Non-blocking,队列中也没有等待的连
接,accept()返回错误EAGAIN或EWOULDBLOCK。民族团结手抄报内容
备注:⼀般来说,实现时accept()为阻塞函数,当监听socket调⽤accept()时,它先到⾃⼰的receive_buf中查看是否有连接数据包;
若有,把数据拷贝出来,删掉接收到的数据包,创建新的socket与客户发来的地址建⽴连接;
若没有,就阻塞等待;
为了在套接字中有到来的连接时得到通知,可以使⽤lect()或poll()。当尝试建⽴新连接时,系统发送⼀个可读事件,然后调⽤accept()为该连接获取套接字。另⼀种⽅法是,当套接字中有连接到来时设定套接字发送SIGIO信号。
返回值
成功时,返回⾮负整数,该整数是接收到套接字的描述符;出错时,返回-1,相应地设定全局变量errno。
历历可数错误处理
Linux下,accept()把已等待的⽹络错误传给新建⽴的连接,当作是accept()返回的错误。这于其他的BSD实现是不同的。为了可靠运⾏,应该在accept()之后检测协议已定义的⼀些⽹络错误,并把这些错误当作EAGAIN并重试。对于TCP/IP协议来说,主要有错误:
泽字取名男孩寓意
ENETDOWN,EPROTO,ENOPROTOOPT,EHOSTDOWN,ENONET,EHOSTUNREACH,EOPNOTSUPP和ENETUNREACH。
原⽂连接: