本文简要介绍ruby语言中 Socket.connect
的用法。
用法
connect(remote_sockaddr) → 0
请求在给定的 remote_sockaddr
上建立连接。如果成功则返回 0,否则引发异常。
参数
-
remote_sockaddr
- 包含在字符串或Addrinfo
对象中的struct
sockaddr
例子:
# Pull down Google's web page
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 80, 'www.google.com' )
socket.connect( sockaddr )
socket.write( "GET / HTTP/1.0\r\n\r\n" )
results = socket.read
基于 Unix 的异常
在基于 unix 的系统上,如果对 connect
的调用失败,可能会引发以下系统异常:
-
Errno::EACCES - 前缀路径的组件的搜索权限被拒绝或对
socket
的写访问被拒绝 -
Errno::EADDRINUSE -
sockaddr
已在使用中 -
Errno::EADDRNOTAVAIL - 指定的
sockaddr
在本地机器上不可用 -
Errno::EAFNOSUPPORT - 指定的
sockaddr
不是指定socket
的地址族的有效地址 -
Errno::EALREADY - 指定套接字的连接已经在进行中
-
Errno::EBADF -
socket
不是有效的文件说明符 -
Errno::ECONNREFUSED - 目标
sockaddr
没有监听连接拒绝连接请求 -
Errno::ECONNRESET - 远程主机重置连接请求
-
Errno::EFAULT - 无法访问
sockaddr
-
Errno::EHOSTUNREACH - 无法到达目标主机(可能是因为主机已关闭或远程路由器无法到达)
-
Errno::EINPROGRESS - 为
socket
设置了O_NONBLOCK,无法立即建立连接;连接将异步建立 -
Errno::EINTR - 建立连接的尝试因传递捕获的信号而中断;连接将异步建立
-
Errno::EISCONN - 指定的
socket
已连接 -
Errno::EINVAL - 用于
sockaddr
的地址长度不是地址系列的有效长度,或者sockaddr
中存在无效系列 -
Errno::ENAMETOOLONG - 解析的路径名长度超过PATH_MAX
-
Errno::ENETDOWN - 用于到达目的地的本地接口已关闭
-
Errno::ENETUNREACH - 不存在到网络的路由
-
Errno::ENOBUFS - 没有可用的缓冲区空间
-
Errno::ENOSR - 可用的 STREAMS 资源不足,无法完成操作
-
Errno::ENOTSOCK -
socket
参数不引用套接字 -
Errno::EOPNOTSUPP - 调用
socket
正在侦听,无法连接 -
Errno::EPROTOTYPE -
sockaddr
的类型与绑定到指定对等地址的套接字不同 -
Errno::ETIMEDOUT - 在建立连接之前尝试连接超时。
在基于 unix 的系统上,如果调用 socket
的地址族是 AF_UNIX
,如果对 connect
的调用失败,则可能会引发以下异常:
-
Errno::EIO - 读取或写入文件系统时发生 i/o 错误
-
Errno::ELOOP - 翻译
sockaddr
中的路径名时遇到太多符号链接 -
Errno::ENAMETOOLLONG - 路径名的一个组成部分超过了 NAME_MAX 个字符,或者整个路径名超过了 PATH_MAX 个字符
-
Errno::ENOENT - 路径名的组件没有命名现有文件或路径名是空字符串
-
Errno::ENOTDIR -
sockaddr
中路径名的路径前缀的组件不是目录
Windows 异常
在 Windows 系统上,如果对 connect
的调用失败,可能会引发以下系统异常:
-
Errno::ENETDOWN - 网络已关闭
-
Errno::EADDRINUSE - 套接字的本地地址已被使用
-
Errno::EINTR - 套接字被取消
-
Errno::EINPROGRESS - 阻塞套接字正在进行或服务提供者仍在处理回调函数。或者
socket
上正在进行非阻塞连接调用。 -
Errno::EALREADY - 见 Errno::EINVAL
-
Errno::EADDRNOTAVAIL - 远程地址不是有效地址,例如ADDR_ANY TODO check ADDRANY TO
INADDR_ANY
-
Errno::EAFNOSUPPORT - 指定系列中的地址不能与此
socket
一起使用 -
Errno::ECONNREFUSED - 目标
sockaddr
没有监听连接拒绝连接请求 -
Errno::EFAULT - 套接字的内部地址或地址长度参数太小或不是用户空间地址的有效部分
-
Errno::EINVAL -
socket
是一个监听套接字 -
Errno::EISCONN -
socket
已连接 -
Errno::ENETUNREACH - 此时无法从此主机访问网络
-
Errno::EHOSTUNREACH - 不存在到网络的路由
-
Errno::ENOBUFS - 没有可用的缓冲区空间
-
Errno::ENOTSOCK -
socket
参数不引用套接字 -
Errno::ETIMEDOUT - 在建立连接之前尝试连接超时。
-
Errno::EWOULDBLOCK - 套接字被标记为非阻塞,无法立即完成连接
-
Errno::EACCES - 尝试将数据报套接字连接到广播地址失败
参看
-
在基于 Unix 的系统上连接手册页
-
Microsoft 的 Winsock 函数参考中的连接函数
相关用法
- Ruby Socket.connect_nonblock用法及代码示例
- 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.bind用法及代码示例
- 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-lang.org大神的英文原创作品 Socket.connect。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。