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