" sin_family"在struct sockaddr_in - /usr/include/netinet/in.h中?

时间:2014-12-05 01:38:35

标签: c linux sockets network-programming archlinux

我是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 在哪里?如果您是专业人士,请告诉我我需要做什么。

1 个答案:

答案 0 :(得分:2)

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_COMMON(sin_)结构中有一个sockaddr_in是一个宏。 现在让我们看看 /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中{{1}}的结果。