sockaddr 结构 - (sys/socket.h)

Jor*_*vis 6 c sockets linux ip network-programming

我一整天都在阅读sys/socket.h并终于开始理解它,现在开始使用它,但是,我不确定为什么我不能为sa_family结构成员赋值sockaddr。

\n\n

规格sockaddr结构:

\n\n
struct sockaddr{\n    sa_family_t   sa_family       address family\n    char          sa_data[]       socket address (variable-length data)\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

数据类型: sa_family_t- 无符号整型(2-4 字节)

\n\n

价值观:

\n\n
Name                Purpose                          Man page\n       AF_UNIX, AF_LOCAL   Local communication              unix(7)\n       AF_INET             IPv4 Internet protocols          ip(7)\n       AF_INET6            IPv6 Internet protocols          ipv6(7)\n       AF_IPX              IPX - Novell protocols\n       AF_NETLINK          Kernel user interface device     netlink(7)\n       AF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)\n       AF_AX25             Amateur radio AX.25 protocol\n       AF_ATMPVC           Access to raw ATM PVCs\n       AF_APPLETALK        AppleTalk                        ddp(7)\n       AF_PACKET           Low level packet interface       packet(7)\n       AF_ALG              Interface to kernel crypto API\n
Run Code Online (Sandbox Code Playgroud)\n\n

这有点令人困惑,因为这些值是char数据类型而不是unsigned int.

\n\n

简单测试:

\n\n
#include<stdio.h>\n#include<sys/socket.h> \n\nint main(void){\n    struct sockaddr_in address;\n    address.sin_family = AF_INET;\n    printf("Socket Address Family: %s\\n", address.sin_family);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误:

\n\n

storage size of \xe2\x80\x98address\xe2\x80\x99 isn\xe2\x80\x99t known

\n\n

它应该打印出来Socket Address Family: AF_INET......我在这里错过了什么?

\n

Pau*_*l92 5

这是因为您没有包含该结构的定义。该结构sockaddr_in定义在<netinet/in.h>. 更多详情请参见:sockaddr_in 未声明的标识符

  • @JordanDavis 你不想这样做。除了“sa_family”字段之外,“struct sockaddr”是一个不透明的结构,在不同的机器上可能有不同的布局。尝试直接写入“sa_data”是不可移植的。 (2认同)