c++ 什么是sa_family_t

jjhzyzn0  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(201)

我使用的是Beej's Guide to Network Programming,我使用的是VC++ 2010,但是当我将结构体复制粘贴到我的程序中时,一些类型出现为不正确的标识符。例如:
u_int32_t就是这样出现的,经过一些搜索,我发现这些是1999年左右C语言中的旧类型。我本可以只包括 stdint.h,但这需要我记住它们的含义。相反,我使用了标准的int,它是32位长(4个字节),对于其他64位长(8个字节)的,我使用了long long int
总之,我缩小到我的最后一个语法错误,它说sa_family_t是一个无效的标识符。我不知道它应该是什么,搜索什么也没有找到。这是我的问题,我不知道我应该为它指定什么类型标识符。
另一件困扰我的事是:char __ss_pad1[_SS_PAD1SIZE];SS_PAD1SIZE也以红色显示为无效。

nvbavucw

nvbavucw1#

sa_family_t should be an unsigned integer. Windows头文件不符合该标准。Winsock.h定义sockaddr结构如下:

struct sockaddr {
        u_short sa_family;              /* address family */
        char    sa_data[14];            /* up to 14 bytes of direct address */
};

因此,要编译代码,您需要自己键入def sa_family_t。

x8diyxa7

x8diyxa72#

如果有人得到了这个答案,并在Linux下寻找sa_family_t;,它在这里定义:
https://github.com/torvalds/linux/blob/1a5304fecee523060f26e2778d9d8e33c0562df3/include/linux/socket.h#L28

typedef __kernel_sa_family_t    sa_family_t;

__kernel_sa_family_t的定义如下:
https://github.com/torvalds/linux/blob/1a5304fecee523060f26e2778d9d8e33c0562df3/include/uapi/linux/socket.h#L10

typedef unsigned short __kernel_sa_family_t;

所以最终,sa_family_tunsigned short,即2个字节。这使得整个struct sockaddr达到了16个字节:

struct sockaddr {
    sa_family_t sa_family;  // unsigned short
    char        sa_data[14];

相关问题