本文簡要介紹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 Socket.recvfrom_nonblock用法及代碼示例
- 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.tcp_server_sockets用法及代碼示例
- Ruby Socket.bind用法及代碼示例
- Ruby Socket.getaddrinfo用法及代碼示例
- Ruby Socket.getnameinfo用法及代碼示例
- Ruby Socket.unix_server_socket用法及代碼示例
- Ruby Socket.accept_nonblock用法及代碼示例
- 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.recvfrom。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
