本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。