【问题标题】:Where is "sin_family" in struct sockaddr_in - /usr/include/netinet/in.h?struct sockaddr_in - /usr/include/netinet/in.h 中的“sin_family”在哪里?
【发布时间】:2014-12-05 01:38:35
【问题描述】:
我是 c 编程中的新网络套接字。我正在尝试制作一个简单的服务器客户端。以下是我想要的:
...
//Binding to a port
struct sockaddr_in name;
name.sin_family = PF_INET;
name.sin_port = (in_port_t)htons(30000);
name.sin_addr.s_addr = htonl(INADDR_ANY);
...
sin_family - /usr/include/netinet/in.h - Linux 在哪里?如果您是专业人士,请告诉我知道我需要做什么。
【问题讨论】:
标签:
c
linux
sockets
network-programming
archlinux
【解决方案1】:
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
您会看到sockaddr_in 结构中有一个__SOCKADDR_COMMON(sin_),它是一个宏。
现在让我们看看 /usr/include/i386-linux-gnu/bits/sockaddr.h 中的宏定义:
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
和
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
所以最终sockaddr_in 扩展为:
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
(sizeof (unsigned short int) -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
这就是sin_family 进入sockaddr_in 的方式。