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