本文簡要介紹ruby語言中  Socket.listen  的用法。
用法
listen( int ) → 0使用指定的int 作為 backlog 偵聽連接。僅當 socket 的類型為  SOCK_STREAM  或  SOCK_SEQPACKET  時,對 listen 的調用才適用。
參數
- 
backlog- 待處理連接隊列的最大長度。
示例 1
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.bind( sockaddr )
socket.listen( 5 )示例 2(監聽任意端口,僅基於 unix 的係統):
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
socket.listen( 1 )基於 Unix 的異常
在基於 unix 的係統上,上述方法將起作用,因為在地址 ADDR_ANY 上創建了一個新的 sockaddr 結構,用於內核傳遞的任意端口號。它不適用於 Windows,因為 Windows 要求 socket 必須通過調用 bind 才能綁定 listen 。
如果 backlog 數量超過實現相關的最大隊列長度,將使用實現的最大隊列長度。
在基於 unix 的係統上,如果對 listen 的調用失敗,可能會引發以下係統異常:
- 
Errno::EBADF - socket參數不是有效的文件說明符
- 
Errno::EDESTADDRREQ - socket未綁定到本地地址,並且協議不支持偵聽未綁定的套接字
- 
Errno::EINVAL - socket已連接
- 
Errno::ENOTSOCK - socket參數不引用套接字
- 
Errno::EOPNOTSUPP - socket協議不支持監聽
- 
Errno::EACCES - 調用進程沒有適當的權限 
- 
Errno::EINVAL - socket已關閉
- 
Errno::ENOBUFS - 係統資源不足,無法完成調用 
Windows 異常
在 Windows 係統上,如果對 listen 的調用失敗,可能會引發以下係統異常:
- 
Errno::ENETDOWN - 網絡已關閉 
- 
Errno::EADDRINUSE - 套接字的本地地址已被使用。這通常發生在 bind的執行期間,但如果對bind的調用是針對部分通配符地址(涉及 ADDR_ANY)並且如果在調用時需要提交特定地址,則可能會延遲listen
- 
Errno::EINPROGRESS - Windows Sockets 1.1 調用正在進行或服務提供者仍在處理回調函數 
- 
Errno::EINVAL - socket尚未與對bind的調用綁定。
- 
Errno::EISCONN - socket已連接
- 
Errno::EMFILE - 沒有更多的套接字說明符可用 
- 
Errno::ENOBUFS - 沒有可用的緩衝區空間 
- 
Errno::ENOTSOC - socket不是套接字
- 
Errno::EOPNOTSUPP - 引用的 socket不是支持listen方法的類型
參看
- 
在基於 Unix 的係統上收聽手冊頁 
- 
微軟 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.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 Socket.getservbyname用法及代碼示例
- Ruby Socket.connect_nonblock用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Socket.listen。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
