【问题标题】: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 的方式。

    【讨论】:

    • 非常感谢@sunny1304!
    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2014-11-23
    • 2014-11-12
    相关资源
    最近更新 更多