當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Ruby Socket.listen用法及代碼示例


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