网络编程中的数据传输函数

虽然sendrecvsendmsgrecvmsg 都是用于在网络编程中进行数据传输的函数。但是它们各自的功能和应用场景有所不同

sendrecv

send
  • 功能send 用于将数据发送到连接的套接字。

  • 原型

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    
  • 参数

    • sockfd:套接字文件描述符。
    • buf:指向要发送的数据的缓冲区。
    • len:要发送的数据字节数。
    • flags:发送标志,通常为 0。
  • 应用场景:适用于简单的数据发送,不需要附加的控制信息或多个数据缓冲区。

recv
  • 功能recv 用于从连接的套接字接收数据。

  • 原型

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

    • sockfd:套接字文件描述符。
    • buf:指向用于存储接收数据的缓冲区。
    • len:缓冲区的大小。
    • flags:接收标志,通常为 0。
  • 应用场景:适用于简单的数据接收,不需要附加的控制信息或多个数据缓冲区。

sendmsgrecvmsg

sendmsg
  • 功能sendmsg 用于发送带有辅助数据的消息,支持发送多个数据缓冲区和控制信息。

  • 原型

    ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
    
  • 参数

    • sockfd:套接字文件描述符。
    • msg:指向 msghdr 结构体,包含要发送的数据和控制信息。
    • flags:发送标志。
  • 应用场景:适用于需要发送多个数据缓冲区或附加控制信息如文件描述符的场合。

recvmsg
  • 功能recvmsg 用于接收带有辅助数据的消息,可以处理更复杂的场景,如接收多个数据缓冲区和控制信息。

  • 原型

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

    • sockfd:套接字文件描述符。
    • msg:指向 msghdr 结构体,用于存储接收到的数据和控制信息。
    • flags:接收标志。
  • 应用场景:适用于需要接收多个数据缓冲区或附加控制信息的场合。

总结如下:

  • sendrecv
    • 适用于简单的、单一数据缓冲区的发送和接收。
    • 不支持传递控制信息,如文件描述符。
    • 适合大多数简单的 TCP/UDP 数据传输场景。
  • sendmsgrecvmsg
    • 适用于需要处理复杂数据结构的网络应用程序。
    • 支持可以处理多个数据缓冲区。
    • 支持附加控制信息的传递,如文件描述符传递、权限信息。
    • 在 UNIX 域套接字中非常有用,在进程之间共享或传递对内核资源的访问权限如文件或套接字,可以使用 sendmsgrecvmsg 通过文件描述符来实现。这是与内核数据结构交互的常见方法,但并不是直接传输内核数据结构本身。内核数据结构是内核内部的实现细节,通常不在用户空间中直接传递。

你可能感兴趣的:(网络,服务器,linux,c++)