fluffos Logo
Fluffos
    • 项目资源
    • 官网网址
    • 下载
    • 工具
    • 下载PDF(开发中)
    • 下载Html压缩包(开发中)
    • 编辑
    • 编辑当前页面

      编辑当前页面内容
    • 创建新页面

      添加创建当前页面内容
    • 更新
    • 创建时间:2019-01-04 13:09:57
    • 创建者:final
    • 最后更新:2020-02-13 14:02:48
    • 最后更新者:final
    • 项目列表(逐步完善中)
    • Evennia 中文文档
    • Fluffos 中文文档
    • Ldmud 中文文档
    • Muddery 中文文档
    • Mudos文档(官方停止更新-同Fluffos)
    • (管理者项目开发中)
    • 0 创建编辑文档列表
    • 个人设置
    • 锁定屏幕
    • 登出

Fluffos 中文文档

  1. 首页
  2. API文档
  3. 套接字(sockets)
套接字(sockets)

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。


socket_accept

接受一个 socket 的连接(connection)
语法:
#include <socket_err.h>int socket_accept( int s, string read_callback,string write_callback );
用法:
参数 s 是一个已用 socket_create(3) 建立、用 socket_bind(3)指定了一个位址,并且正倾听(listen)在 socket_listen(3) 之後连接的 socket。socket_accept() 从未处理(pending)的连接序列中选取第一个连接,建立一个和 s 相同属性的新 socket 并且配置一个新的描述值(descriptor)。如果在序列中没有未处理的连接,socket_accept() 会传回如後面会提到的错误值。这个被接受的socket 将被用来从相连的另一端读写资料;它不能用来接受别的连接。原先的 socket s 则保持开启以接受未来的连接。

read_callback 这个参数是给驱动程式在一个新的 socket(不是正要接受的 socket)接收资料时呼叫的函式名称。这个读取回呼函式(callback)应该是下列格式:

void read_callback(int fd)

这里的 fd 是准备接收资料的 socket。

write_callback 这个参数是给驱动程式在新的 socket(不是正要接受的 socket)准备好写入时呼叫的函式名称。这个写入回呼函式应该是下列格式:

void write_callback(int fd)

这里的 fd 是准备好写入的 socket。

注意:如果新 socket 不正常关闭,譬如和 socket_close(3) 的呼叫结果不同的话,则会呼叫正要接受的 socket(不是新的 socket)的 close_callback。这个关闭回呼函式应该是如下格式:

void close_callback(int fd)

这里的 fd 是已关闭的 socket。

传回值:socket_accept() 在成功时会传回一个对於已接受 socket 的非负数描述值。失败时,它传回一个负值。socket_error(3) 可以用来得到这个错误码的文字叙述。

错误值:EEFDRANGE      描述值超出□围。

EEBADF         无效的描述值。

EESECURITY     企图违反安全。

EEMODENOTSUPP  不支援此 socket 型态。

EENOTLISTN     socket 不在倾听中。

EEWOULDBLOCK   操作将被停滞(block)。

EEINTR         中断的系统呼叫。

EEACCEPT       接受问题。

EENOSOCKS      没有多馀的 efun sockets。

参照:socket_bind(3), socket_connect(3), socket_create(3),socket_listen(3)
翻译:Kenny@Broken.History 97.Jul.26 (printed 3/16/95)

socket_acquire

接收一个 socket 的所有权(ownership)
语法:
#include <socket_err.h>
int socket_acquire( int socket, string read_callback,string write_callback,string close_callback );
用法:
呼叫 socket_acquire() 是为了要完成开始自 socket_release()要转移一个 socket 所有权(和控制权)到一个新物件上的握手程序(handshake)。socket_release() 呼叫那个将拥有所有权新物件的释放回呼(callback)函式以通知那个物件说它想要传送这个 socket的控制权过去。那个将拥有所有权的新物件有责任决定它是否接受这个 socket。若它愿意接受的话,则要呼叫 socket_acquire() 以完成这个转移。如果不愿的话,则这个回呼函式不需完成握手程序只需返回即可。

在前一种情况下,握手程序完成并且新物件变成那个 socket 的拥有者。那些读取、写入和关闭回呼函式参数也将参考这个新物件的函式。这些都需要指定以使 MudOS 驱动程式可以知道要呼叫新物件内的哪些函式。不同意接受这个 socket 将会使 socket_release()传回 EESOCKNOTRLSD 以至於拥有者能进行适当的清除动作。

socket_acquire() 可以只由释放回呼函式的内部呼叫,并只含有那个指定的 socket。

参照:socket_release(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_address

传回一个 efun socket 的远端位址
语法:
#include <socket_err.h>
string socket_address( int s );
用法:
socket_address() 传回 efun socket s 的远端位址。传回的位址格式如下:

"127.0.0.1 23".

传回值:socket_address() 传回:

成功时是一个字串形式的位址。

失败时是一个空字串。

参照:socket_connect(3), socket_create(3), resolve(3),query_host_name(3), query_ip_name(3), query_ip_number(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_bind

命名(bind)一个 socket
语法:
#include <socket_err.h>int socket_bind( int s, int port );
用法:
socket_bind() 为一个未命名的 socket 指定一个名字。当一个socket 由 socket_create(3) 建立後,它已存在於一个命名空间(位址族, address family)但还没有指定名字。socket_bind()需要埠号来为 socket s 命名。

传回值:socket_bind() 传回:

成功时是 EESUCCESS。

失败时是一个有如下意义的负值。

错误值:EEFDRANGE      描述值(descriptor)超出□围。

EEBADF         无效的描述值。

EESECURITY     企图违反安全。

EEISBOUND      socket 已命名。

EEADDRINUSE    此位址已被使用。

EEBIND         命名问题。

EEGETSOCKNAME  getsockname 问题。

参照:socket_connect(3), socket_create(3), socket_listen(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_close

关闭一个 socket
语法:
#include <socket_err.h>int socket_close( int s );
用法:
socket_close() 会关闭 socket s。这会释放出一个被使用的 socketefun 插槽(slot)。

传回值:socket_close() 传回:

成功时是 EESUCCESS。

失败时是含如下意义的负值。

错误值:EEFDRANGE      描述值(descriptor)超出□围。

EEBADF         无效的描述值。

EESECURITY     企图违反安全。

参照:socket_accept(3), socket_create(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_connect

初始化一个 socket 上的连接(connection)
语法:
#include <socket_err.h>
int socket_connect( int s, string address,string read_callback,string write_callback );
用法:
参数 s 是一个 socket。s 必须是一个 STREAM 型态或是一个 MUD型态的 socket。address 是这个 socket 将要尝试连接的位址。位址是 "127.0.0.1 23" 这种格式。

read_callback 参数是给驱动程式在由它的另一端得到资料时呼叫的函式名称。这个读取回呼(callback)函式应该是如下格式:

void read_callback(int fd, mixed message)

这里的 fd 是要接收资料的 socket,而 message 是接收到的资料。

write_callback 参数是给驱动程式在 socket 已准备好写入时呼叫的函式名称。这个写入回呼函式应该是如下格式:

void write_callback(int fd)

这里的 fd 是已准备好写入的 socket。

传回值:socket_connect() 传回:

成功时是 EESUCCESS。

失败时是一个含有如下意义的负值。

错误值:EEFDRANGE      描述值(descriptor)超出□围。

EEBADF         无效的描述值。

EESECURITY     企图违反安全。

EEMODENOTSUPP  不支援此 socket 型态。

EEISLISTEN     socket 正在倾听(listening)。

EEISCONN       socket 已连接。

EEBADADDR      位址格式问题。

EEINTR         中断的系统呼叫。

EEADDRINUSE    位址已被使用。

EEALREADY      操作已在进行中。

EECONNREFUSED  连接被拒绝。

EECONNECT      连接问题。

参照:socket_accept(3), socket_close(3), socket_create(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_create

建立一个 efun socket
语法:
#include <socket_err.h>
int socket_create( int mode, string read_callback,void | string close_callback );
用法:
socket_create() 建立一个 efun socket。mode 决定了要建立哪种型态的 socket。目前支援的 socket 型态有:

MUD         以 TCP 协定传送 LPC 资料。

STREAM      以 TCP 协定传送原始资料。

DATAGRAM    以 UDP 协定传送资料。

read_callback 这个参数是给驱动程式在 socket 由对方接到资料时呼叫用的函式名称。这个读取回呼(callback)函式应该是如下格式:

void read_callback(int fd, mixed message)

这里的 fd 是接收资料的 socket,而 message 是接收到的资料。

close_callback 这个参数是给驱动程式在 socket 不正常关闭时呼叫的函式名称,如不同於 socket_close() 的呼叫结果。这个关闭回呼函式应该是如下格式:

void close_callback(int fd)

这里的 fd 是已被开闭的 socket。注意:close_callback 不能用在 DATAGRAM 型态的 socket 上。

传回值:socket_create() 传回:

成功时是一个非负的描述值(descriptor)。

失败时是一个下列意义的负值。

错误值:EEMODENOTSUPP  不支援此 socket 型态。

EESOCKET       建立 socket 的问题。

EESETSOCKOPT   setsockopt 的问题。

EENONBLOCK     设定非停滞(non-blocking)模式的问题。

EENOSOCKS      没有多馀的 efun sockets。

EESECURITY     企图违反安全。

参照:socket_accept(3), socket_bind(3), socket_close(3),socket_connect(3), socket_listen(3), socket_write(3)
翻译:Kenny@Broken.History 97.Jul.26 (printed 3/16/95)

socket_error

传回一个 socket 错误码的文字叙述
语法:
#include <socket_err.h>
string socket_error( int error );
用法:
socket_error() 传回一个描述所产生之错误的字串。

传回值:socket_error() 传回:

成功时是一个描述错误码的字串。

错误的输入值时是 "socket_error: invalid error number"。(译注:"socket_error: 无效的错误码")

参照:socket_create(3), socket_connect(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_listen

倾听(listen)一个 socket 的连接(connection)。
语法:
#include <socket_err.h>
int socket_listen( int s, string listen_callback );
用法:
为了要接受连接,首先要以 socket_create(3) 建立一个 socket,再以 socket_listen(3) 将这个 socket 放到倾听模式,最後才以socket_accept(3) 接受这个连接。socket_listen() 呼叫只能作用於 STREAM 或是 MUD 型态的 sockets。

listen_callback 参数是给驱动程式在得到正倾听中 socket 的连接时呼叫的函式名称。这个倾听回呼(callback)函式应该是这个格式:

void listen_callback(int fd)

这里的 fd 是正倾听中的 socket。

传回值:socket_listen() 传回:

成功时是 EESUCCESS。

失败时是一个含有如下意义的负值。

错误码:EEFDRANGE      描述值(descriptor)超出□围。

EEBADF         无效的描述值。

EESECURITY     企图违反安全。

EEMODENOTSUPP  不支援此 socket 型态。

EENOADDR       socket 尚未设定位址。

EEISCONN       socket 已连接。

EELISTEN       倾听问题。

参照:socket_accept(3), socket_connect(3), socket_create(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_release

释放一个 socket 的所有权(ownership)给另一物件。
语法:
#include <socket_err.h>
int socket_release( int socket, object ob,string release_callback );
用法:
socket_release() 是用来改变原先处理连接设定(set-up)之物件的所有权(和控制权)并且转移一个已连接(connected)的 socket 给另一物件以供未来之用。

socket 所有权的转移包括了一个目前拥有所有权物件和这个物件想转移 socket 的物件间的握手程序(handshake)。这个握手程序是由呼叫 socket_release() 开始的。socket_release() 经过安全性、完整性(integrity)检查後,再呼叫物件 ob 的 release_callback函式。这个函式是用来通知 ob socket 所有权将要转移给它。然後ob 有责任在释放回呼(callback)函式中呼叫 socket_acquire()。如果呼叫了 socket_acquire(),握手程序就完成了,而 socket 所有权就已经成功地转移给 ob。ob 也可以不呼叫 socket_acquire() 而婉谢接受这个 socket 的责任,此时,所有权不会改变,而且原来的socket 所有者必须决定如何回应这个情况。

如果 socket 所有者成功地转移,则 socket_release() 会传回EESUCCESS。如果 ob 不接受这个 socket 的所有权的话,则会传回EESOCKNOTRLSD。其他基於违反安全、错误的 socket 描述值(descriptor)等的错误码也可能传回。

参照:socket_acquire(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

socket_write

透过一个 socket 传送资料
语法:
#include <socket_err.h>
int socket_write( int s, mixed message,void | string address );
用法:
socket_write() 用一个 socket s 来传送资料。如果 socket s 是STREAM 或是 MUD 型态,这个 socket 就必须是已连接的(connected)而且不能指定位址。如果 socket 是 DATAGRAM 型态,就必须指定位址。位址的格式是 "127.0.0.1 23"。

传回值:socket_write() 传回:

成功时是 EESUCCESS。

失败时是一个含有下述意义的负值。

错误值:EEFDRANGE      描述值(descriptor)超出□围。

EEBADF         无效的描述值。

EESECURITY     企图违反安全。

EENOADDR       socket 未指定位址。

EEBADADDR      位址格式问题。

EENOTCONN      socket 尚未连接。

EEALREADY      操作已在进行中。

EETYPENOTSUPP  不支援此物件型态。

EEBADDATA      传送资料含有太多层次。

EESENDTO       sendto 问题。

EEMODENOTSUPP  不支援此 socket 型态。

EEWOULDBLOCK   操作将会停滞(blocked)。

EESEND         传送问题。

EECALLBACK     等待回呼(callback)中。

参照:socket_connect(3), socket_create(3)
翻译:Kenny@Broken.History 97.Jul.27 (printed 3/16/95)

温馨提示

当前页面内容可随意编辑. 但是需要管理员人工审核.

fluffos logo

Fluffos 中文文档

高性能的Mud Driver
  • 目录索引
  • 更新日志
  • 编译
    • Lunix编译
    • Windows编译
  • API文档
    • 互动函数(interactive)
    • 字符串(strings)
    • 套接字(sockets)
    • 物件(objects)
    • 数字(numbers)
    • Mudlib(mudlib)
    • 映射(mappings)
    • 内部处理(internals)
    • 常规(general)
    • 函数(functions)
    • 浮点数(floats)
    • 文件处理(filesystem)
    • 数据库(dbase)
    • 编译(compile)
    • 调用(calls)
    • 缓冲区(buffers)
    • 阵列(arrays)
    • 系统(system)
  • 其他
    • 配置 options.h
最后编辑:final 最后更新时间:2020-02-13 14:02:48
最后编辑:final 最后更新时间:2020-02-13 14:02:48

© 2019 Final开发维护 邮箱:finalcn#126.com