int inet_accept(struct socket *sock, struct socket *newsock, int flags, bool kern) { struct sock *sk1 = sock->sk; int err = -EINVAL; // 这里调用的是 tcp_prot->inet_csk_accept() // sk_prot = tcp_prot struct sock *sk2 = sk1->sk_prot->accept(sk1, flags, &err, kern); ...
SOCK_CLOEXEC: 由于fork时,子进程默认拷贝父进程的数据空间、堆、栈等,当然也包含socket, 通过设置这个flag, 可以保证fork出来的子进程不持有父进程创建的socket。 第三个参数 protocol 指定通信协议,对于domain=AF_INET/AF_INET6来说,常见的enum值有 IPPROTO_TCP IPPROTO_UDP,全量。 socket() 返回一个 socket fi...
int__sys_accept4(intfd,structsockaddr__user*upeer_sockaddr,int__user*upeer_addrlen,intflags){structsocket*sock,*newsock;structfile*newfile;interr,len,newfd,fput_needed;structsockaddr_storageaddress;if(flags&~(SOCK_CLOEXEC|SOCK_NONBLOCK))return-EINVAL; flags仅支持SOCK_CLOEXEC和SOCK_NONBLOCK, 设...
connfd = ::accept4(listenfd, (structsockaddr*)&peeraddr, &peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC);if(connfd ==-1)//函数发生错误{if(errno == EMFILE)//表示每个进程允许打开的文件描述符数量最大值已经到达{//遇到这种情况的解决方法是/* 准备一个空闲的文件描述符。遇到这种情况,先关闭这个空闲文...
#include<sys/socket.h>// 成功,返回代表新连接的描述符,错误返回-1,同时错误码设置在errnointaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);// 注意,实际上Linux还有个accept扩展accept4:// 额外添加的flags参数可以为新连接描述符设置O_NONBLOCK|O_CLOEXEC(执行exec后关闭)这两个标记intaccept4(int...
int sockfd = ::socket(family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_TCP); 1. 2. 3. 4. 注意:在修改文件描述符标志或文件状态标志时必须谨慎,先要取得现在的标志值,然后按照希望修改它,最后设置新标志值。不能只是执行F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位。
int__sys_socket(intfamily,inttype,intprotocol) {intretval;structsocket *sock;intflags;/*Check the SOCK_* constants for consistency.*/BUILD_BUG_ON(SOCK_CLOEXEC!=O_CLOEXEC); BUILD_BUG_ON((SOCK_MAX| SOCK_TYPE_MASK) !=SOCK_TYPE_MASK); BUILD_BUG_ON(SOCK_CLOEXEC&SOCK_TYPE_MASK); BUILD_...
#include <sys/socket.h>// 成功,返回代表新连接的描述符,错误返回-1,同时错误码设置在errnointaccept(intsockfd,struct sockaddr* addr,socklen_t *addrlen);// 注意,实际上Linux还有个accept扩展accept4:// 额外添加的flags参数可以为新连接描述符设置O_NONBLOCK|O_CLOEXEC(执行exec后关闭)这两个标记intaccept...
#include<sys/socket.h>// 成功,返回代表新连接的描述符,错误返回-1,同时错误码设置在errnointaccept(int sockfd,struct sockaddr*addr,socklen_t*addrlen);// 注意,实际上Linux还有个accept扩展accept4:// 额外添加的flags参数可以为新连接描述符设置O_NONBLOCK|O_CLOEXEC(执行exec后关闭)这两个标记intaccept4(...
- SOCK_CLOEXEC:关闭exec时自动关闭此文件描述符。 - SOCK_NONBLOCK:使新套接字处于非阻塞模式。 ## 2. `accept4()`函数返回值 成功执行时,`accept4()`返回一个新的套接字描述符,该描述符与客户端建立了一个连接。错误发生时,返回-1,并将错误代码存储在`errno`中。 ## 3. `accept4()`函数示例 下面...