recv, recvfrom, recvmsg用于接收数据

1. recv

#include <sys/socket.h>
ssize_t recv(int sockfd, void * buf, size_t nbytes, int flags);
返回值:已字节计数的消息长度,若无可用消息或者对方已经按序结束则返回0,出错返回-1
flag有以下值:
MSG_OOB:     如果协议支持,接收带外数据
MSG_PEER:    返回报文内容而不是真正取走报文
MSG_TRUNC:   即使报文被截断,要求返回的是报文的实际长度
MSG_MAITALL: 等待直到所有数据可用(仅支持SOCK_STREAM)
对于SOCK_STREAM套接字,接收的数据可以比请求的少,标志MSG_WAITALL可以阻止这种行文,除非所需数据全部收到,recv函数才返回。对于SOCK_DGRAM和SOCK_SEQPACKET套接字,MSG_WAITALL标志没有什么影响,因为这些基于报文的套接字类型一次读取就返回整个报文。
如果发送者已经调用了shutdown来结束传输,或者网络协议支持默认的顺序关闭且发送端已经关闭,那么所有的数据接收完毕后,recv返回0。

2. recvform

如果要定位数据发送者,可以使用recvfrom来得到数据发送者的源地址
#include <sys/socket.h>
ssize_t recvfrom(int sockfd,  //套接字
                 void * buf,  //接收数据缓冲区
                 size_t len,  //接收数据长度
                 int flags,   //标志
                 struct sockaddr * addr, //数据发送者地址,函数调用后该地址结构被填充
                 socklen_t * addrlen  //地址长度指针(注意这里是个指针)
                 );
返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,出错返回-1.

如果addr非空,他将包含数据发送者的套接字地址,当调用recvfrom时,需要设置addrlen参数指向一个包含addr所指套接字缓冲区字节大小的整数。返回时,该整数设为该地址的实际字节大小。
因为可以获得发送者的地址,recvfrom通常用于无连接套接字。否则recvfrom等同于recv。

3. recvmsg

recvmsg将接收到的数据送入多个缓冲区,或者想接收辅助数据
#include <sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr * msg, int flag);
返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,出错返回-1.

结构msghdr被recvfrom用于指定接收数据的输入缓冲区。可以设置参数flags来改变recvfrom的默认行文。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值