• send, sendto, sendmsg


    概述

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

    int send(int s, const void *msg, size_t len, int flags);
    int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
    int sendmsg(int s, const struct msghdr *msg, int flags);

    描述

    Send, sendto, 和 sendmsg 用于向另一个套接字传递消息. Send 仅仅用于连接套接字,而 sendtosendmsg 可用于任何情况下.

    目标地址用 to 指定, tolen 定义其长度.消息的长度用 len 指定. 如果消息太长不能通过下层协议,函数将返回 EMSGSIZE 错误,消息也不会被送出.

    在数据传送过程中所产生的错误不会返回给 send. 如果发生本地错误,则返回-1.

    当要发送的消息长度大于套接字当前可用缓冲区时, send 将阻塞,除非在套接字上设置了非阻塞式输入输出模式. 对于非阻塞模式,这种情况下将返回 EAGAIN 错误. The 系统调用 select(2) 可以用来检测何时可以发送更多的数据.

    参数 flags 是一个标志字,可以包含下列标志:

    对于支持带外数据的套接字,
    MSG_OOB 将送出 out-of-band (带外)数据(比如, SOCK_STREAM 类型的套接字); 下层协议也必须支持. 带外 数据.
    MSG_DONTROUTE
    在送出分组时不使用网关.只有直接连接在网络上的主机才能接收到数据.这个标志通常仅用于诊断和路由程序. 可路由的协议族才能使用这个标志;包套接字不可以.
    MSG_DONTWAIT
    使用非阻塞式操作;如果操作需要阻塞,将返回 EAGAIN 错误(也可以用 F_SETFL fcntl(2) 设置 O_NONBLOCK 实现这个功能.)
    MSG_NOSIGNAL
    当流式套接字的另一端中断连接时不发送 SIGPIPE 信号,但仍然返回 EPIPE 错误.
    MSG_CONFIRM (仅用于Linux 2.3以上版本)
    通知链路层发生了转发过程:得到了另一端的成功应答. 如果链路层没有收到通知,它将按照常规探测网络上的相邻主机(比如通过免费arp). 只能用于 SOCK_DGRAMSOCK_RAW 类型的套接字,且仅对IPv4和IPv6有效.详情参见 arp(7)

    结构体 msghdr 的定义如下.详情参见 recv(2) 和下文.

    struct msghdr {
        void         * msg_name;     /*地址选项*/
        socklen_t    msg_namelen;    /*地址长度*/
        struct iovec * msg_iov;      /*消息数组*/
        size_t       msg_iovlen;     /*msg_iov中的元素个数*/
        void         * msg_control;  /*辅助信息,见下文*/
        socklen_t    msg_controllen; /*辅助数据缓冲区长度*/
        int          msg_flags;      /*接收消息标志*/
    };
    
    

    可以使用 msg_control msg_controllen 成员发送任何控制信息.内核所能处理的最大控制消息缓冲区长度由 net.core.optmem_max sysctl对每个套接字进行限定;参见 socket(7).

    返回值

    成功时返回发送的字符个数,否则返回-1.

    错误代码

    其中一些是套接字层产生的标准错误.其他的是下层协议模块产生的;参见各自的man手册.

    EBADF
    指定了非法描述符.
    ENOTSOCK
    参数 s 不是一个套接字.
    EFAULT
    参数指定的用户地址空间非法.
    EMSGSIZE
    消息长度越界.
    EAGAIN或者EWOULDBLOCK
    套接字设置为非阻塞式,但所请求的操作需要阻塞.
    ENOBUFS
    网络接口输出队列已满.这通常表明接口已停止发送,也有可能是暂时性的拥挤(这不会发生在linux下,当设备队列溢出时数据报只是被简单丢弃.
    EINTR
    接收到信号.
    ENOMEM
    没有可用内存.
    EINVAL
    传递的参数非法.
    EPIPE
    连接套接字的本地端已关闭.这种情况下进程还会接收到 SIGPIPE 信号,除非设置了 MSG_NOSIGNAL  
  • 相关阅读:
    城市生态规划关键技术方法之三:城市生态系统服务功能理论与方法
    AE中用矢量数据剪裁栅格
    城市生态规划的基本原理与程序
    城市生态规划关键技术方法之一:生态系统健康理论与方法
    城市生态规划的基本概念、内容与方法
    终于找到使用Sql Server Management Studio导致蓝屏的罪魁祸首了
    保证相同类型的MDI子窗体只会被打开一次的方法
    甩掉数据字典,让Sql Server数据库也来一个自描述
    新鲜试用IE8 beta2
    让我目瞪口呆的program.exe
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11098313.html
Copyright © 2020-2023  润新知