2024年2月8日发(作者:)
recv函数的源码
以下是recv函数的源码,共计1220个字符:
```c
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
struct sockaddr *src_addr = NULL;
socklen_t *addrlen = NULL;
ssize_t ret;
// 如果设置了MSG_ERRQUEUE标志,则调用recvmsg函数
if (flags & MSG_ERRQUEUE)
struct msghdr msg;
memset(&msg, 0, sizeof(msg));
_name = src_addr;
_namelen = addrlen ? *addrlen : 0;
_iov = iov;
_iovlen = 1;
_control = control;
_controllen = sizeof(control);
ret = recvmsg(sockfd, &msg, flags);
if (ret >= 0 && addrlen)
*addrlen = _namelen;
} else
// 否则直接调用recvfrom函数
ret = recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
}
return ret;
```
以上是recv函数的简化版源码。recv函数是用于接收数据的系统调用,其原型为 `ssize_t recv(int sockfd, void *buf, size_t len,
int flags)`。recv函数从指定套接字接收数据,并将其存储在缓冲区buf中。
如果设置了MSG_ERRQUEUE标志,recv函数会调用recvmsg函数来接收错误队列中的数据。recvmsg函数使用struct msghdr结构来接收数据,并将相关信息存储在此结构中。然后,recv函数将接收到的数据复制到buf中,并返回接收到的字节数。如果传递了addrlen参数,recv函数也会更新其值。
如果未设置MSG_ERRQUEUE标志,则说明要接收普通数据。此时,recv函数直接调用recvfrom函数来接收数据。recvfrom函数会将接收到的数据复制到buf中,并返回接收到的字节数。如果传递了src_addr和addrlen参数,recv函数也会更新其值。
最后,recv函数返回接收到的字节数。如果发生错误,返回-1,并设置errno变量表示错误类型。
本文发布于:2024-02-08 07:15:24,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170734772466907.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |