不能用sendmsg提升原始套接字发送性能

使用原始套接字发送IP报文,通过setsocketopt中的IP_HDRINCL(Header Include)选项来设置socket,由应用而不是协议栈自动填充IP header。
原来是通过sendto发送,在实际测试中发现每次sendto调用需要10微秒做左右。就像stackoverflow的这篇文章一样,希望通过sendmsg提高发送速度。

struct msghdr {
    void         *msg_name;       /* optional address */
    socklen_t     msg_namelen;    /* size of address */
    struct iovec *msg_iov;        /* scatter/gather array */
    size_t        msg_iovlen;     /* # elements in msg_iov */
    void         *msg_control;    /* ancillary data, see below */
    size_t        msg_controllen; /* ancillary data buffer len */
    int           msg_flags;      /* flags (unused) */
};

我们将多个已构造的IP包,填充到msg_iov数组内,再调用sendmsg,结果出错,返回EMSGSIZE,即message too long。
查阅资料后发现,对于不需要协议栈填充IP头的原始套接字,msg_iov数据总长度超过MTU时,sendmsg不能一次发送。
如果没有设置IP_HDRINCL来由我们自己定义IP头部,那么sendmsg会进行IP分片。
综上,sendmsg无法提升原始套接字发送IP包的速度。
参考:
http://blog.csdn.net/liuxingen/article/details/45622517
http://sock-raw.org/papers/sock_raw

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值