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


Ruby Socket.recvfrom用法及代碼示例


本文簡要介紹ruby語言中 Socket.recvfrom 的用法。

用法

recvfrom(maxlen) → [mesg, sender_addrinfo]
recvfrom(maxlen, flags) → [mesg, sender_addrinfo]

socket 接收最多 maxlen 字節。 flags 是零個或多個 MSG_ 選項。結果的第一個元素 mesg 是接收到的數據。第二個元素 sender_addrinfo 包含發送方的協議特定地址信息。

參數

  • maxlen - 從套接字接收的最大字節數

  • flags - 零個或多個 MSG_ 選項

示例

# In one file, start this first
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 )
client, client_addrinfo = socket.accept
data = client.recvfrom( 20 )[0].chomp
puts "I only received 20 bytes '#{data}'"
sleep 1
socket.close

# In another file, start this second
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.connect( sockaddr )
socket.puts "Watch this get cut short!"
socket.close

基於 Unix 的異常

在基於 unix 的係統上,如果對 recvfrom 的調用失敗,可能會引發以下係統異常:

  • Errno::EAGAIN - socket 文件說明符被標記為 O_NONBLOCK 並且沒有數據等待接收;或 MSG_OOB 已設置,並且沒有可用的帶外數據,並且 socket 文件說明符標記為 O_NONBLOCK 或 socket 不支持阻塞等待 out-of-band-data

  • Errno::EWOULDBLOCK - 見 Errno::EAGAIN

  • Errno::EBADF - socket 不是有效的文件說明符

  • Errno::ECONNRESET - 連接被對等端強行關閉

  • Errno::EFAULT - 無法訪問或寫入套接字的內部緩衝區、地址或地址長度

  • Errno::EINTR - 在任何數據可用之前中斷的信號 recvfrom

  • Errno::EINVAL - 設置了 MSG_OOB 標誌,並且沒有可用的帶外數據

  • Errno::EIO - 讀取或寫入文件係統時發生 i/o 錯誤

  • Errno::ENOBUFS - 係統中沒有足夠的資源來執行操作

  • Errno::ENOMEM - 沒有足夠的內存來滿足請求

  • Errno::ENOSR - 可用的 STREAMS 資源不足,無法完成操作

  • Errno::ENOTCONN - 在未連接的 connection-mode 套接字上嘗試接收

  • Errno::ENOTSOCK - socket 不引用套接字

  • Errno::EOPNOTSUPP - 此套接字類型不支持指定的標誌

  • Errno::ETIMEDOUT - 在連接建立期間連接超時或由於活動連接上的傳輸超時

Windows 異常

在 Windows 係統上,如果對 recvfrom 的調用失敗,可能會引發以下係統異常:

  • Errno::ENETDOWN - 網絡已關閉

  • Errno::EFAULT - socket 上的內部緩衝區和 from 參數不是用戶地址空間的一部分,或者內部 fromlen 參數太小而無法容納對等地址

  • Errno::EINTR - (阻塞)調用被內部調用 WinSock 函數 WSACancelBlockingCall 取消

  • Errno::EINPROGRESS - 阻塞的 Windows Sockets 1.1 調用正在進行或服務提供者仍在處理回調函數

  • Errno::EINVAL - socket 尚未與對 bind 的調用綁定,或者指定了未知標誌,或者為啟用了 SO_OOBINLINE 的套接字指定了 MSG_OOB ,或者(對於字節 stream-style 套接字僅)socket 上的內部 len 參數為零或負數

  • Errno::EISCONN - socket 已連接。不允許在麵向連接或無連接的套接字上使用已連接的套接字調用 recvfrom

  • Errno::ENETRESET - 由於 keep-alive 活動在操作進行時檢測到故障,連接已中斷。

  • Errno::EOPNOTSUPP - 指定了 MSG_OOB ,但 socket 不是 stream-style 例如類型 SOCK_STREAM 。在與 socket 關聯的通信域中不支持 OOB 數據,或者 socket 是單向的並且僅支持發送操作

  • Errno::ESHUTDOWN - socket 已關閉。調用shutdown 後,不能在套接字上調用recvfrom

  • Errno::EWOULDBLOCK - socket 被標記為非阻塞,調用 recvfrom 會阻塞。

  • Errno::EMSGSIZE - 消息太大而無法放入指定的緩衝區並被截斷。

  • Errno::ETIMEDOUT - 由於網絡故障或另一端的係統在沒有通知的情況下關閉,連接已斷開

  • Errno::ECONNRESET - 遠程端執行硬或異常關閉重置了虛擬電路。應用程序應該關閉套接字;它不再可用。在UDP-datagram 套接字上,此錯誤表明先前的發送操作導致了 ICMP 端口不可達消息。

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Socket.recvfrom。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。