当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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