Linux内核分析:recv、recvfrom、recvmsg函数实现

先看一下这三个函数的声明:

1 #include <sys/types.h>
2 #include <sys/socket.h>
3 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
4 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
5 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

1、这个三个函数都是用来从一个socket接收消息的,不同之处在于recvfrom和recvmsg可以用在已经建立连接的socket,也可以用在没有建立连接的socket,关于建立连接的socket,简单来说就是有没有调用connect,调用了bind的socket也可以。

2、addrlen是一个value-result参数,传入函数之前初始化为src_addr的大小,返回之后存放src_addr实际大小。

3、三个函数的返回值都是成功读取的消息的长度,如果一个消息的长度大于buffer的长度,多余的字节根据socket的类型可能会被丢弃(例如UDP)。

4、如果没有消息可读,这个三个函数会阻塞直到有数据;或者可以设置为非阻塞的,在这种情况下返回-1,同时errno被设置为EAGAIN或者EWOULDBLOCK。

5、如果返回值为0,表示对端已经关闭。

 函数实现:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值