recv, recvfrom, recvmsg用于接收数据
1. recv
#include
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
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
ssize_t recvmsg(int sockfd, struct msghdr * msg, int flag);
返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,出错返回-1.
结构msghdr被recvfrom用于指定接收数据的输入缓冲区。可以设置参数flags来改变recvfrom的默认行文。
阅读(4172) | 评论(0) | 转发(2) |