当前位置:  技术问答>linux和unix

如何用sendto实现sendmsg

    来源: 互联网  发布时间:2016-08-11

    本文导语:  请问如何用sendto实现sendmsg。网上查了一下二个函数,好像差不多,应该是可以用sendto来实现sendmsg的。 sendto的掉用形式: ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,                       const...

请问如何用sendto实现sendmsg。网上查了一下二个函数,好像差不多,应该是可以用sendto来实现sendmsg的。
sendto的掉用形式:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
sendmsg的掉用形式:
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

这样写不知道对不对,请各位大大指点一下
ssize_t mysendmsg(int sockfd,const struct msghdr *msg,int flags)
{
     void *buf;
     size_t len;
     struct sockaddr *dest_addr;
     socklen_t addrlen;

     buf = msg.msg_iov->iov_base;
     len = msg.msg_iov->iov_len;
     
     dest_addr = msg.msg_name;
     addrlen     = msg.msg_namelen;

      return sendto(sockfd, buf, len,  flags,dest_addr, addrlen);     
}


其中struct msghdr *msg的主要成员如下:
msg.msg_name=NULL; 报文名称
msg.msg_namelen=0; 报文名称长度
msg.msg_iov=&iov;  报文收发向量指针
msg.msg_iovlen=1;  报文收发向量数量
msg.msg_control=NULL; 报文控制块
msg.msg_controllen=0; 报文控制块长度
iov.iov_base=ubuf; 收发向量数据区地址
iov.iov_len=size; 收发向量数据区长度

按这上写法,msg_control和msg_controllen 就没有用到了。不知道有没有问题。 


|
看你是否要加控制信息了,如果sendmsg需要实现控制信息,就需要增加许多信息.

在sendmsg和recvmsg中可以使用msghdr结构中的msg_control和msg_controllen成员发送和接收辅助数据(ancillary data),也称之为控制信息(control information)。

辅助数据的各种用法如下:

协议   cmsg_level   cmsg_type        说明 
IPv4  IPPROTO_IP   IP_RECVDSTADDR   接收UDP数据报的目的地址 
                      IP_RECVIF        接收UDP数据报的接口索引 
IPv6  IPPROTO_IPV6 IPV6_DSTOPTS     指定/接收目标选项 
                      IPV6_HOPLIMIT    指定/接收跳限 
                      IPV6_HOPOPTS     指定/接收步跳选项 
                      IPV6_NEXTHOP     指定下一跳地址 
                      IPV6_PKTINFO     指定/接收分组信息 
                      IPV6_RTHDR       指定/接收路由头部 
Unix域 SOL_SOCKET   SCM_RIGHTS       发送/接收描述字 
                       SCM_CREDS       发送/接收用户凭证 

辅助数据由一个或多个辅助数据对象组成,每个对象由一个cmsghdr结构开头,该结构在中定义如下:
/* Structure used for storage of ancillary data object information.  */
struct cmsghdr
  {
    size_t cmsg_len;            /* Length of data in cmsg_data plus length
                                   of cmsghdr structure.
                                   !! The type should be socklen_t but the
                                   definition of the kernel is incompatible
                                   with this.  */
    int cmsg_level;             /* Originating protocol.  */
    int cmsg_type;              /* Protocol specific type.  */
#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
    __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
#endif
  };

|

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sendto,总是返回-1,查看errno说是EPERM
  • 关于udp sendto时候端口选定问题
  • [疑惑]UDP中的recvfrom奇怪现象,怎么保持上次sendto的内容???哪位帮解释一下
  • sendto() 返回>0,说明数据已经被发到网络上了嘛?
  • 急问socket编程:程序中执行sendto()返回errno=101是什么原因啊
  • 请教关于sendto问题
  • sendto 函数返回失败错误码14,请大侠指点什么原因,在线等待
  • netlink,中用户使用sendto有什么意义
  • sendto返回ENOBUFS是什么原因
  • 求助UDP socket sendto返回EHOSTDOWN的问题
  • 用sendto(socket, buf, strlen(buf), ...)发送一个包,如何得到发送的源地址(也就是本机的源地址)
  • 关于网络通信中recvfrom和sendto的用法
  • 期待高手:关于udp的sendto,发给本机ip,为什么我抓不到包?
  • socket sendto: Network is unreachable?
  • 当主机多地址时,sendto()发送函数为什么携带的源IP地址永远都是第一个?
  • 为什么linux中sendto函数中的msg.msg_iovlen=1;
  • 为何udp的sendto返回永远为零????
  • linux下socket问题:为什么我的socket服务程序(UDP)总是第一次sendto()失败?
  • ping的时候出现sendto: No such process
  • linux socket sendto( )函数问题,初学,大家指点!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3