Chinaunix首页 | 论坛 | 博客
  • 博客访问: 564719
  • 博文数量: 127
  • 博客积分: 1169
  • 博客等级: 少尉
  • 技术积分: 1298
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-16 14:29
个人简介

空白

文章分类

全部博文(127)

分类: LINUX

2012-03-30 21:59:08

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的默认行文。

阅读(4158) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~