姐妹们,今天来聊聊recvfrom和recvmsg!
最近在学习网络编程,看到recvfrom和recvmsg这两个函数,感觉有点懵圈。它们都是用来接收数据的,到底有什么区别呢?今天就来给大家讲讲我的理解,希望对大家有所帮助!
recvfrom和recvmsg都是用来接收数据的函数,但它们有一些细微的差别。
1. recvfrom函数
recvfrom函数用于从套接字接收数据,并可以获取发送数据的源地址。它一般用于 UDP 通信,因为 UDP 是无连接的,需要通过源地址来识别发送数据的节点。
recvfrom函数的原型如下:
c
ssize_t recvfrom(int sockfd, void buf, size_t len, int flags,
struct sockaddr src_addr, socklen_t addrlen);
参数解释:
sockfd: 套接字描述符
buf: 用于存放接收数据的缓冲区
len: 缓冲区大小
flags: 标志位,用于控制接收行为
src_addr: 用于存放源地址的结构体指针
addrlen: 用于存放源地址长度的指针
2. recvmsg函数
recvmsg函数也是用来接收数据的,它与recvfrom函数的主要区别在于它支持接收多种类型的消息,包括数据、控制信息、辅助数据等。它一般用于 TCP 通信,因为 TCP 是面向连接的,接收到的数据不需要额外的信息来识别发送端。
recvmsg函数的原型如下:
c
ssize_t recvmsg(int sockfd, struct msghdr msg, int flags);
参数解释:
sockfd: 套接字描述符
msg: 用于存放接收数据的结构体指针,包含数据缓冲区、控制信息、辅助数据等
flags: 标志位,用于控制接收行为
3. 总结
简单来说,recvfrom函数更适合用于接收 UDP 数据,而recvmsg函数更适合用于接收 TCP 数据。
举个例子:
想象一下,你和你的闺蜜在网上聊天,你收到了她的消息。
如果你们使用的是微信,相当于使用的是 TCP 连接,你只需要关注消息内容,不需要知道消息来自哪个手机。此时,使用recvmsg函数即可。
如果你们使用的是 QQ,相当于使用的是 UDP 连接,你需要知道消息来自哪个 QQ 号码,才能确定是你的闺蜜发的。此时,使用recvfrom函数就能获取到源地址信息。
希望我的分享能帮助到大家理解recvfrom和recvmsg的区别!
你平时会使用哪种网络通信方式呢? 🤔 欢迎在评论区分享你的想法!