本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。