接受系统调用

这个 接受 ()使用基于连接的套接字类型进行系统调用( 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()调用中的错误

  1. EAGAIN或EWOULDBLOCK: 插座标记为非阻塞,不存在可接受的连接。POSIX。1-2001和POSIX。1-2008允许在这种情况下返回任一错误,并且不要求这些常量具有相同的值,因此便携式应用程序应该检查这两种可能性。
  2. EBADF: sockfd不是一个打开的文件描述符。
  3. Econaborted: 连接已中止。
  4. EFAULT: addr参数不在用户地址空间的可写部分。
  5. EINTR: 系统调用被在有效连接到达之前捕获的信号中断;见信号(7)。
  6. 艾因瓦尔: 套接字未侦听连接,或addrlen无效(例如,为负)。
  7. 艾因瓦尔: (accept4())标志中的值无效。
  8. EMFILE: 已达到每个进程对打开的文件描述符数量的限制。
  9. 文件: 已达到系统范围内打开文件总数的限制。
  10. ENOBUFS,ENOMEM: 没有足够的可用内存。这通常意味着记忆 分配受套接字缓冲区限制,而不受系统内存限制。
  11. ENOTSOCK: 文件描述符sockfd不引用套接字。
  12. EOPNOTSUPP: 引用的套接字不是SOCK_STREAM类型。
  13. 埃普罗托: 协议错误。

本文由 普拉莫德·库马尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享