Linux?????????recvmsg???sendmsg??????

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux?????????recvmsg???sendmsg??????相关的知识,希望对你有一定的参考价值。

???????????????   ??????   ddr   ??????   ??????   ??????   ??????   des   ?????????   

recvmsg ??? sendmsg ??????

#include <sys/types.h>
#include <sys/socket.h>

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

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);

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

???????????????????????????????????????????????? msghdr ???????????????

struct msghdr {
    void          *msg_name;        // protocol address
    socklen_t      msg_namelen;     // size of protocol address
    struct iovec  *msg_iov;         // scatter/gather array
    int            msg_iovlen;      // elements in msg_iov
    void          *msg_control;     // ancillary data (cmsghdr struct)
    socklen_t      msg_controllen;  // length of ancillary data
    int            msg_flags;       // flags returned by recvmsg()
};
  • msg_name ??? msg_namelen ??????????????????????????????????????????????????????????????? UDP ??????????????????????????? recvfrom ??? sendto ?????????????????????????????????
    • msg_name ?????????????????????????????????????????????????????????????????????????????? sendmsg ??????????????????????????????recvmsg????????????????????????????????????????????????????????????????????? TCP ????????????????????? UDP ???????????????msg_name ?????????????????????
    • msg_namelen ?????? sendmsg ??????????????????????????? recvmsg ???????????????-???????????????
  • msg_iov ??? msg_iovlen ?????????????????????????????????????????????????????????iovec???????????????????????? readv ??? writev ?????????????????????????????????
  • msg_control ??? msg_controllen ???????????????????????????????????????????????????????????????msg_controllen ?????? recvmsg ????????????-???????????????

?????? recvmsg ??? sendmsg?????????????????????????????????????????????

  • ????????????????????? flags ?????????
  • ????????????????????? msghdr ????????? msg_flags ?????????????????????????????????????????????????????????????????????????????????
  • ?????? recvmsg ?????? msg_flags ?????????recvmsg ???????????????flags ?????????????????? msg_flags ??????????????????????????????????????????????????????????????????????????? recvmsg ??????????????? msg_flags ???????????????
  • sendmsg ????????? msg_flags ?????????????????????????????? flags ????????????????????????????????????????????????????????????????????? sendmsg ??????????????? MSG_DONTWAIT ?????????????????? flags ??????????????????????????? msg_flags ????????????????????????????????????

recvmsg ????????? 7 ??????????????????

  • MSG_BCAST??????????????? BSD/OS ??????????????????????????????????????????????????????????????????????????????????????????????????? IP ????????????????????????????????? IP_RECVD-STADDR ?????????????????????????????????????????????????????? UPD ?????????????????????????????????????????????????????????
  • MSG_MCAST??????????????? BSD/OS ???????????????????????????????????????????????????????????????????????????????????????
  • MSG_TRUNC?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? iov_len ??????????????????
  • MSG_CTRUNC?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????msg_controllen??????
  • MSG_EOR?????????????????????????????????????????????????????????????????????TCP ?????????????????????????????????????????????????????????
  • MSG_OOB????????????????????? TCP ??????????????????????????????????????????????????? OSI ???????????????
  • MSG_NOTIFICATION??????????????? SCTP ???????????????????????????????????????????????????????????????????????????????????????

????????????????????? msghdr ???????????????????????????????????????????????????????????????????????? UDP ??????????????? recvmsg???
??????????????????
?????????????????????????????? 16 ???????????????????????????????????? 20 ???????????????????????????????????????????????? 3 ??? iovec ????????????????????????????????????????????? 100 ?????????????????????????????????????????? 60 ?????????????????????????????????????????? 80 ????????????????????????????????????????????????????????? IP_RECVDSTADDR ???????????????????????????????????? UDP ?????????????????? IP ?????????

????????? 198.38.100:2000 ???????????? 170 ????????? UDP ??????????????????????????????????????? UDP ?????????????????? IP ????????? 206.168.112.96.??????????????? recvmsg ????????? msghdr ???????????????????????????
??????????????????
????????? recvmsg ????????????????????????????????????????????????????????????????????????????????????????????????

  • ??? msg_name ????????????????????????????????????????????????????????????????????????????????????????????????????????? IP ???????????? UPD ????????????
  • msg_namelen ??????????????????-???????????????????????????????????? msg_name ??????????????????????????????????????????????????????????????? recvmsg ????????????????????????????????? 16.
  • ???????????????????????? 100 ???????????????????????????????????????????????? 60 ????????????????????????????????????????????? 10 ????????????????????????????????????????????????????????????????????? 70 ?????????????????????recvmsg ???????????????????????? 170?????????????????????????????????
  • ??? msg_control ??????????????????????????????????????? cmsghdr ???????????? cmsghdr ????????????cmsg_len ???????????? 16???cmsg_level ???????????? IPPROTO_IP???cmsg_type ???????????? IP_RECVDSTADDR????????? 4 ???????????????????????? UDP ?????????????????? IP ??????????????? 20 ????????????????????? 4 ????????????????????????
  • msg_controllen ????????????????????????????????????????????????????????????????????????????????????-???????????????recvmsg ????????????????????? 16???
  • msg_flags ??????????????? recvmsg ?????????????????????????????????????????????




以上是关于Linux?????????recvmsg???sendmsg??????的主要内容,如果未能解决你的问题,请参考以下文章

recvmsg linux收到错误数据

在 Linux 中,recv() 有效,但 recvmsg() 无效

Linux TCP 单机优化

recv() 跳过 UDP 数据包

套接字之recvmsg系统调用

tcp_recvmsg 函数具体解释