这个 接受 ()使用基于连接的套接字类型进行系统调用( SOCK_流,SOCK_SEQPACKET )。它提取侦听套接字sockfd的挂起连接队列上的第一个连接请求,创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符。新创建的套接字未处于侦听状态。原始套接字sockfd不受此调用的影响。 语法:
null
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- sockfd: 争论 索克夫 是用socket()创建的套接字,绑定到本地地址 绑定 (),并且正在监听一段时间后的连接 听 ().
- 地址 :论点 地址 是指向sockaddr结构的指针。该结构由通信层已知的对等套接字的地址填充。返回地址addr的确切格式由套接字的地址族决定。当addr为NULL时, 什么都没有填满;在这种情况下, 阿德伦 未使用,也应为NULL。
- 阿德伦 当前位置 阿德伦 参数是一个值结果参数:调用者必须初始化它以包含addr指向的结构的大小(字节);返回时,它将包含对等地址的实际大小。
- 返回: 成功后,这些系统调用将返回一个非负整数,该整数是已接受套接字的文件描述符。出现错误时,返回-1,然后 呃不 设置适当。
如果提供的缓冲区太小,返回的地址将被截断;在这种情况下,addrlen将返回一个大于提供给调用的值。 如果队列上不存在挂起的连接,并且套接字未标记为非阻塞, 接受 ()在建立连接之前阻止呼叫者。如果套接字标记为非阻塞,并且队列上不存在挂起的连接, 接受 ()因错误而失败 伊根 或 埃伍德街区 .
// C program to show accept system call is blocking call #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #define BACKLOG 3 // Driver program int main() { struct sockaddr_in my_addr, peer_addr; socklen_t peer_addr_size; int sd, b, l, acc; my_addr.sin_family = AF_INET; // Creating socket sd = socket(AF_INET, SOCK_STREAM, 0); // Binding b = bind(sd, ( struct sockaddr *)&my_addr, sizeof ( struct sockaddr_in)); if (b > 0) printf ( "Binded Successfully" ); else printf ( "Binding Error" ); // Listening l = listen(sd, BACKLOG); if (l > 0) printf ( "Listening..." ); else printf ( "Not listening.." ); peer_addr_size = sizeof ( struct sockaddr_in); // Accept system call acc = accept(sd, ( struct sockaddr *)&peer_addr, &peer_addr_size); if (acc > 0) printf ( "Accepted" ); else printf ( "Not accepted" ); } |
输出:
Binding Successfully Listening..
accept()调用中的错误
- EAGAIN或EWOULDBLOCK: 插座标记为非阻塞,不存在可接受的连接。POSIX。1-2001和POSIX。1-2008允许在这种情况下返回任一错误,并且不要求这些常量具有相同的值,因此便携式应用程序应该检查这两种可能性。
- EBADF: sockfd不是一个打开的文件描述符。
- Econaborted: 连接已中止。
- EFAULT: addr参数不在用户地址空间的可写部分。
- EINTR: 系统调用被在有效连接到达之前捕获的信号中断;见信号(7)。
- 艾因瓦尔: 套接字未侦听连接,或addrlen无效(例如,为负)。
- 艾因瓦尔: (accept4())标志中的值无效。
- EMFILE: 已达到每个进程对打开的文件描述符数量的限制。
- 文件: 已达到系统范围内打开文件总数的限制。
- ENOBUFS,ENOMEM: 没有足够的可用内存。这通常意味着记忆 分配受套接字缓冲区限制,而不受系统内存限制。
- ENOTSOCK: 文件描述符sockfd不引用套接字。
- EOPNOTSUPP: 引用的套接字不是SOCK_STREAM类型。
- 埃普罗托: 协议错误。
本文由 普拉莫德·库马尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END