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