问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-08-16 21:17

我来回答

2个回答

热心网友 时间:2023-10-09 02:05

因为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.

热心网友 时间:2023-10-09 02:05

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];
};

热心网友 时间:2023-10-31 03:02

因为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.

热心网友 时间:2023-10-31 03:03

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];
};
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
平安e家保是什么险 2023年高级会计师报名时间和条件 2022高级会计师报考条件要求是什么? 问几个英文语法问题,希望能正确回答~ 女生锁骨下长痣,左右都有 不是很对称 寓意什么呐? 抖音上传照片音乐短怎么办 断夜奶好方法 婴儿断夜奶最佳方法 建设银行,你打算坑害多少优质客户? 【PS教程】如何做出凹陷字体效果的氛围海报 Socket 编程MAC地址与IP地址如对应? 162.上身胖,胸部大的女生适合穿斗篷式的大衣吗? 胖人穿斗篷 最近很潮斗篷 胖人适合穿斗篷嘛??? 辽朝最后一个皇帝是谁?能详细介绍吗 大辽一共有几个皇帝? 我的笔记本电脑自带的喇叭,刚开机时声音正常,用一会儿就不响了,这是什么原因造成的? 面对感情时不知足,总是要找备胎的星座有哪些? 生姜在泡菜坛烂了是什么原因 腌的姜要烂了,怎么办? 我腌制的嫩姜和雪菜为什么每次都烂掉? 泡姜为什么会泡烂 新起的泡菜水为什么把生姜泡烂了- 问一问 通过工行个人网上银行操作银商转账注册时提示“H1042,MAC校验错”,如何处理? tpe制品有缩水现象怎么办? 科目四承载跟核载的区别,乘载28人核载55人是什么意思? 为爱付出,不求回报甘当备胎男的三大星座男有哪些 贾泽锐这个名字多少分析预测 男孩缺金和水,叫泽锐可以吗 陶泽锐的名字好不好 如何直接发送 自定义的以太网报头、IP报头、TCP报头 UDP协议调用sendto时可否设定发送端口 如何煮好吃的家常面 梦见原来单位领导打人骂人是什么意思? 如何理解学前儿童艺术教育对儿童想象力? AE CS4是什么? 学前儿童艺术教育技能训练有哪些 烤饼干的时候,是上火呢,还是上下火 既往不咎,恋爱中从来不问恋人过往的星座,你知道他们是谁吗? 关于真情的妙语,好段 在爱情中较为粗心,不太会体贴恋人的星座,你都知道几个? 小区物业管理范围和责任有哪些?怎么办物业公司 恋人必须时刻向这些星座报备行踪 企业在国际贸易活动中如何办理外汇的核销及退税 太阳能充电控制器如何自动识别12V24V系统?最好有电路图,一般MPPT控制器的电路图怎样的?有加分 爱神是什么时候上映的 钟汉良唱的爱神这首歌是哪个电视剧里的歌曲 钟汉良和张丽主演的电视剧全集 电影爱神2013 钟汉良演的拍摄地点是在哪里啊 2013年电影《爱神》里面的女声英文插曲叫什么?谢谢!