zoukankan      html  css  js  c++  java
  • recvmsg和sendmsg函数

      这两个函数是最通用的I/O函数。实际上我们把所有read、readv、recv和recvfrom调用替换成recvmsg调用。类似地,各种输出函数调用也可以替换成sendmsg调用 

    #include <sys/socket.h>
    ssize_t  recvmsg(int sockfd,struct msghdr *msg,int flags);
    ssize_t  sendmsg(int sockfd,stuct 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这两个成员用于套接字未连接的场合。他们类似于recvfrom和sendto的第五个和第六个参数:msg_name指向一个套接字地址结构,调用者在其中存放接收者(对于sendmsg调用)或发送者(对于recvmsg调用)的协议地址。如果无需指明协议地址,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成员设置为该值不起作用。

      

  • 相关阅读:
    uva 1510
    ADN中国团队參加微软的Kinect全国大赛获得三等奖
    在 window7 window8下公布webService注意问题
    html5调用手机摄像头,实现拍照上传功能
    4、深入理解Bean
    恶补jquery(四)jquery中事件--冒泡
    html5css3杂记
    Core Data 和 sqlite3的性能对比【图】3gs,iPhone4,4s,5的性能测试。
    boost 的函数式编程库 Phoenix入门学习
    information_schema模式表介绍 processlist
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3202810.html
Copyright © 2011-2022 走看看