sendto()函数中参数to在实际中使用一般要加(struct sockaddr *)为什么?

 我来答
花花浪客
2013-06-08 · TA获得超过2069个赞
知道小有建树答主
回答量:792
采纳率:100%
帮助的人:715万
展开全部
因为sendto的参数要的就是
(struct sockaddr *)
类型的参数,这个结构可以支持多种地址类型,典型的例子就是ipv4和ipv6。
但是通常你的接受端的地址是通过地址解析得到的,sockaddr_in(对应ipv4)或者是sockaddr_in6(对应Ipv6),而不是struct sockaddr,所以需要类型转换。
至于如何区分指向的到底是什么类型的地址,主要依靠第一个字段ushort sa_family;来区分。
MSDN里面的描述是:
Winsock functions using sockaddr are not strictly interpreted to be pointers
to a sockaddr structure. The structure is interpreted differently in the context
of different address families. The only requirements are that the first
u_short is the address family and the total size of the memory buffer in
bytes is namelen.
百度网友e23d545
2013-06-08 · 超过11用户采纳过TA的回答
知道答主
回答量:24
采纳率:0%
帮助的人:23.4万
展开全部
sendto()的参数类型是sockaddr*,但平时使用sockaddr_in赋值更方便,所以传递参数时进行强制类型转换成sockaddr*。
sockaddr_in结构和sockaddr结构有效字节数都是16字节,所以地址互转使用没问题。
sockaddr_in结构单独定义了port和ip属性,可以直接操作赋值。而sockaddr只定义了一个内存块,你直接操作sockaddr要对port ,ip值按格式进行内存拷贝很麻烦,关键你不知道IP和PORT应该应拷到具体地址上的哪个位置就更麻烦。
看看下面定义你就明白了。
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式