本文简要介绍ruby语言中 Socket.bind
的用法。
用法
bind(local_sockaddr) → 0
绑定到给定的本地地址。
参数
-
local_sockaddr
- 包含在字符串或Addrinfo
对象中的struct
sockaddr
示例
require 'socket'
# use Addrinfo
socket = Socket.new(:INET, :STREAM, 0)
socket.bind(Addrinfo.tcp("127.0.0.1", 2222))
p socket.local_address #=> #<Addrinfo: 127.0.0.1:2222 TCP>
# use struct sockaddr
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.bind( sockaddr )
基于 Unix 的异常
在基于 unix 的系统上,如果对 bind
的调用失败,可能会引发以下系统异常:
-
Errno::EACCES - 指定的
sockaddr
受保护,当前用户无权绑定到它 -
Errno::EADDRINUSE - 指定的
sockaddr
已在使用中 -
Errno::EADDRNOTAVAIL - 指定的
sockaddr
在本地机器上不可用 -
Errno::EAFNOSUPPORT - 指定的
sockaddr
不是调用socket
的系列的有效地址 -
Errno::EBADF - 指定的
sockaddr
不是有效的文件说明符 -
Errno::EFAULT - 无法访问
sockaddr
参数 -
Errno::EINVAL -
socket
已绑定到地址,并且协议不支持绑定到新的sockaddr
或socket
已关闭。 -
Errno::EINVAL - 地址长度不是地址族的有效长度
-
Errno::ENAMETOOLONG - 解析的路径名长度超过PATH_MAX
-
Errno::ENOBUFS - 没有可用的缓冲区空间
-
Errno::ENOSR - 可用的 STREAMS 资源不足,无法完成操作
-
Errno::ENOTSOCK -
socket
不引用套接字 -
Errno::EOPNOTSUPP -
socket
的套接字类型不支持绑定到地址
在基于 unix 的系统上,如果调用 socket
的地址族是 Socket::AF_UNIX
,如果对 bind
的调用失败,则可能会引发以下异常:
-
Errno::EACCES - 前缀路径的组件的搜索权限被拒绝或对
socket
的写访问被拒绝 -
Errno::EDESTADDRREQ -
sockaddr
参数是一个空指针 -
Errno::EISDIR - 与 Errno::EDESTADDRREQ 相同
-
Errno::EIO - 发生 i/o 错误
-
Errno::ELOOP - 翻译
sockaddr
中的路径名时遇到太多符号链接 -
Errno::ENAMETOOLLONG - 路径名的一个组成部分超过了 NAME_MAX 个字符,或者整个路径名超过了 PATH_MAX 个字符
-
Errno::ENOENT - 路径名的组件没有命名现有文件或路径名是空字符串
-
Errno::ENOTDIR -
sockaddr
中路径名的路径前缀的组件不是目录 -
Errno::EROFS - 名称将驻留在只读文件系统上
Windows 异常
在 Windows 系统上,如果对 bind
的调用失败,可能会引发以下系统异常:
-
Errno::ENETDOWN - 网络已关闭
-
Errno::EACCES - 尝试将数据报套接字连接到广播地址失败
-
Errno::EADDRINUSE - 套接字的本地地址已被使用
-
Errno::EADDRNOTAVAIL - 指定的地址不是此计算机的有效地址
-
Errno::EFAULT - 套接字的内部地址或地址长度参数太小或不是用户空间寻址的有效部分
-
Errno::EINVAL -
socket
已经绑定到一个地址 -
Errno::ENOBUFS - 没有可用的缓冲区空间
-
Errno::ENOTSOCK -
socket
参数不引用套接字
参看
-
在基于 Unix 的系统上绑定手册页
-
Microsoft 的 Winsock 函数参考中的绑定函数
相关用法
- Ruby Socket.pair用法及代码示例
- Ruby Socket.udp_server_sockets用法及代码示例
- Ruby Socket.unpack_sockaddr_in用法及代码示例
- Ruby Socket.udp_server_recv用法及代码示例
- Ruby Socket.new用法及代码示例
- Ruby Socket.tcp用法及代码示例
- Ruby Socket.getservbyport用法及代码示例
- Ruby Socket.listen用法及代码示例
- Ruby Socket.gethostname用法及代码示例
- Ruby Socket.unix_server_loop用法及代码示例
- Ruby Socket.sockaddr_un用法及代码示例
- Ruby Socket.accept用法及代码示例
- Ruby Socket.recvfrom_nonblock用法及代码示例
- Ruby Socket.tcp_server_sockets用法及代码示例
- Ruby Socket.getaddrinfo用法及代码示例
- Ruby Socket.getnameinfo用法及代码示例
- Ruby Socket.unix_server_socket用法及代码示例
- Ruby Socket.accept_nonblock用法及代码示例
- Ruby Socket.recvfrom用法及代码示例
- Ruby Socket.unix用法及代码示例
- Ruby Socket.gethostbyaddr用法及代码示例
- Ruby Socket.ip_address_list用法及代码示例
- Ruby Socket.sysaccept用法及代码示例
- Ruby Socket.getservbyname用法及代码示例
- Ruby Socket.connect_nonblock用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Socket.bind。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。