标签:
名称
accept, accept4——接受套结字连接
摘要
#include <sys/types.h> /* Portable consideration */ #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); #define _GNU_SOURCE /*See feature_test_macros(7) */ int accept(int sockfd,struct sockaddr *addr, socklen_t *addrlen,int flags);
描述
accept系统调用被用于面向连接的套结字类型(SOCK_STREAM,SOCK_SEQPACKET)。它提取排队等待连接sockfd的第一个连接请求,并且创建一个新的连接套结字,返回指向这个连接套结字的文件描述符,新创建的连接套结字不处于监听状态,而监听套结字sockfd也不受函数调用的影响,继续保持监听状态。
参数addr是一个指向sockaddr结构体的指针,这个结构体会被通信对端套结字的地址赋值。地址的格式有套结字地址族和相应的协议决定。如果addr为NULL,那么不会发生填充,addrlen也不会被用到,所以也应该为NULL。
参数addrlen是一个值-结果参数:调用者必须初始化addrlen,使其包含addr结构体的大小(以字节为单位);当函数返回时,该值将包含通信对端地址的实际大小。
如果提供的缓冲区太小,返回的地址将会被截断;在这种情况下,addrlen将会比其初始值还大。
如果队列中没有连接请求,那么监听套结字没有设置为非阻塞(nonblocking),那么accept函数将会阻塞进程,直到有连接请求到来。如果监听套结字设置为非阻塞,并且请求队列中没有连接请求,那么accept()函数返回错误码EAGAIN或者EWOULDBLOCK。
如果想要在有连接请求到来时受到提醒,你可以使用select或者poll。当有请求到来时,你将会收到一个可读的事件,并且通过accept接受连接请求,得到连接套结字。当然你也可以设置套结字当有活动发生时发送SIGIO信号,你可以通过socket(6)获得更多相应细节。
如果flags为0,accept4等价与accept。flags可以通过或运算连接以下值以获得函数的不同行为:
SOCK_NONBLOCK 设置新创建的连接套结字为NON_BLOCK.
SOCK_CLOEXEC 设置新创建的套结字close-on-exec(FD_CLOEXEC)
返回值
成功执行返回新创建的连接套结字的文件描述符,出错返回-1,并且相应设置errno。
标签:
原文地址:http://www.cnblogs.com/cq-shihao/p/5285975.html