Skip to content

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)