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