当前位置: 技术问答>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 就没有用到了。不知道有没有问题。
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
};
在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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。