---
layout: doc
title: sockets / socket_accept
---
# socket_accept

### 名称

    socket_accept() -在一个 socket 上接受连接

### 语法

    int socket_accept( int s, string read_callback, string write_callback );

### 描述

    参数 `s` 是使用 socket_create() 创建的已调用 socket_bind() 绑定地址并通过 socket_listen() 进入监听状态的 socket。 socket_accept() 从待处理的连接队列中提取第一个连接创建一个和 `s` 有相同属性的新的 socket 并分配一个新的文件描述符，如果队列中不存在待处理的连接，socket_accept() 返回一个下面描述的错误。已接受的 socket 用来从已连接到它的 socket 中读数据或向其中写数据，它不能用来接受别的连接，原始的socket `s` 会保持打开状态以接受新的连接。

    参数 `read_callback` 是当新的 socket （不是正在接收中的 socket）收到数据时驱动程序调用的函数名称，这个函数的原型应该是以下格式：

    void read_callback(int fd);

    其中参数 `fd` 是已准备好接收数据的 socket。

    参数 `write_callback` 是当新的 socket （不是正在接收中的 socket） 准备好写入数据时驱动程序调用的函数名称，这个函数的原型应该是以下格式：

    void write_callback(int fd);

    其中参数 `fd` 是已准备好被写入数据的 socket。

    注意：当新的socket 异常关闭时，正在接收中的 socket （不是新的 socket）中的 close_callback 方法会被调用，和调用 socket_close() 的结果不同，close_callback 函数原型应该是以下格式：

    void close_callback(int fd)

    其中参数 `fd` 是被关闭的 socket 连接。

### 返回值

    socket_accept() 在成功时为接受的 socket 返回一个非负描述符，失败时返回一个错误值，可以使用 socket_error() 外部函数获取错误值的文字描述。

#### 错误

    EEFDRANGE      连接描述符（Descriptor）超出范围
    EEBADF         无效的连接描述符
    EESECURITY     试图违反安全性
    EEMODENOTSUPP  不支持的 Socket 模式
    EENOTLISTN     Socket 没有开启监听
    EEWOULDBLOCK   操作会阻塞
    EEINTR         中断的系统调用
    EEACCEPT       接收出问题
    EENOSOCKS      没有空余的 efun sockets

### 参考

    socket_bind(3), socket_connect(3), socket_create(3), socket_listen(3)

### 翻译 ###

    雪风(i@mud.ren)
