recv()、recvfrom() 和 recvmsg() 函数

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,  
                 struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

在 Socket 编程中,recv()、recvfrom() 和 recvmsg() 函数都用于从套接字中接收数据。它们的功能类似,但具体用法有所不同。

recv() recv() 函数的原型为:

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

其中,sockfd 是要接收数据的套接字描述符;buf 是用于接收数据的缓冲区;len 是缓冲区的长度;flags 是一组标志位,用于控制函数的行为。

recv() 函数可以接收 TCP 或 UDP 数据报,并将数据保存在缓冲区中。flags 参数可以设置为 0,表示接收数据时不使用任何特殊标志。recv() 函数返回实际接收到的数据长度,如果返回值为 0,表示对端已经关闭连接。如果发生错误,返回值为 -1。

recvfrom() recvfrom() 函数的原型为:

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 是 src_addr 结构体的长度。

recvfrom() 函数用于接收 UDP 数据报,并将数据保存在缓冲区中。flags 参数可以设置为 0,表示接收数据时不使用任何特殊标志。src_addr 参数用于存储数据发送端的地址,可以为 NULL。addrlen 参数是一个值-结果参数,用于指定 src_addr 结构体的长度,并返回实际存储的地址长度。

recvmsg() recvmsg() 函数的原型为:

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

其中,sockfd 是要接收数据的套接字描述符;msg 是一个指向 msghdr 结构体的指针,用于保存接收到的消息;flags 是一组标志位,用于控制函数的行为。

recvmsg() 函数可以接收 TCP 或 UDP 数据报,与 recv() 函数类似,但支持更多的选项和功能。msg 参数指定了接收到的消息的各种属性,包括数据缓冲区、数据长度、发送端地址等。flags 参数可以设置为 0,表示接收数据时不使用任何特殊标志。

需要注意的是,recvmsg() 函数使用起来比较复杂,需要熟悉 msghdr 结构体的各个

参考: https://linux.die.net/man/2/recv

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:36:58

results matching ""

    No results matching ""