socket编程中IO函数

-------------------------------------------------------------------------------------------------------------------------
+   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)                                                      +
-------------------------------------------------------------------------------------------------------------------------
send只可用于基于连接的socket,sendto和sendmsg由于支持目的地址的传入,所以既可用于无连接的socket也可用于基于连接的socket.
send和write唯一的不同点是flags的存在,当flags为0时,send等于write;
sendto和send唯一的不同点是支持目的地址传入,当面向基于连接的socket时,sendto等于send.
sendmsg除了支持一般数据的发送,还支持多缓冲区数据发送以及附带辅助数据,这些额外功能的实现都是基于msghdr

返回值:
    发送成功返回实际发送的字节数,需要注意sendmsg实际发送的字节数应该是多个缓冲区数据总和
    发送失败返回-1,错误见errno

flags标志可以取0或"|"以下值:
    MSG_DONTROUTE   : 不使用网关来发包,只发送到直接联网的主机,该标志只用于路由协议族
    MSG_DONTWAIT    : 配置成非阻塞模式,这跟调用fcntl(fd,F_SETFL,O_NONBLOCK)效果一样
    MSG_NOSIGNAL    : 当面向流的套接字的另一端终止连接时,继续发起请求将不会产生SIGPIPE信号


目的地址有以下几种常用格式:
    1) 这是通用的套接字地址,16字节
    struct sockaddr{
        sa_family_t    sa_family;  // 地址族
        char sa_data[14];       // 14字节的协议地址
    }
    
    2) 这是internet下套接字的地址形式,16字节
    struct sockaddr_in{
        sa_family_t sin_family; // 地址族,一般就是AF_INET
        in_port_t sin_port;     // 端口号
        struct in_addr sin_addr;    // IP地址
        unsigned char sin_zero[8];  // 填充0以保持和struct sockaddr同样大小
    }

    3) 这是unix本地套接字地址,110字节
    struct sockaddr_un{
        sa_family_t sun_family; // 地址族,固定为AF_LOCAL/AF_UNIX
        char sun_path[108];     // 本地套接字路径名
    }

    4) 这是链路层套接字地址,20字节
    struct sockaddr_ll{
        unsigned short sll_family;  // 地址族,固定为AF_PACKET
        __be16 sll_protocol;        // 上层的协议类型
        int sll_ifindex;            // 接口类型
        unsigned short sll_hatype;  // ARP硬件地址类型(optional)
        unsigned char sll_pkttype;  // 分组类型(optional)
        unsigned char sll_halen;    // MAC地址长度(optional)
        unsigend char sll_addr[8];  // 目的MAC地址(optional)
    }

    5) 这是netlink套接字地址,12字节
    struct sockaddr_nl{
        unsigned short nl_family;   // 地址族,固定为AF_NETLINK
        unsigned short nl_pad;      // 填充0
        unsigned int nl_pid;        // 进程ID
        unsigned int nl_groups;     // 多播组mask
    }


通用socket消息头:
    struct msghdr{
        void *msg_name;             // 消息的目的地址
        int msg_namelen;            // 目的地址长度
        struct iovec *msg_iov;      // 多缓冲区地址数组
        int msg_iovlen;             // 数组长度,也就是缓冲区个数
        void *msg_control;          // 辅助数据地址
        int msg_controllen;         // 辅助数据长度
        int msg_flags;              // 用于接收消息时获取消息的相关属性
    }

IO缓冲区:
    struct iovec{
        void *iov_base;     // buffer基地址
        size_t iov_len;     // buffer长度
    }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值