2013-04-28

要记得清除 sockaddr_in

Views: 17070 | 3 Comments

在 socket connect/bind 所使用 sockaddr_in, 一定要记得 bzero...

struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

因为 sockaddr_in 的定义是

struct in_addr {
  in_addr_t   s_addr;           /* 32-bit IPv4 address */
                                /* network byte ordered */
};

struct sockaddr_in {
  uint8_t         sin_len;      /* length of structure (16) */
  sa_family_t     sin_family;   /* AF_INET */
  in_port_t       sin_port;     /* 16-bit TCP or UDP port number */
                                /* network byte ordered */
  struct in_addr  sin_addr;     /* 32-bit IPv4 address */
                                /* network byte ordered */
  char            sin_zero[8];  /* unused */
};

可能, bind() 函数要求 sin_zero 必须全清空为 0.

Related posts:

  1. 构建C1000K的服务器(1) – 基础
  2. P2P穿透NAT的思路
  3. 对P2P应用不友好的NAT
  4. 使用 Channel 进行可靠传输
  5. 经典的”服务器最多65536个连接”误解
Posted by ideawu at 2013-04-28 15:22:48

3 Responses to "要记得清除 sockaddr_in"

  • 您是忘了addr.sin_addr.s_addr = INETADDR_ANY这句吧
    bzero只是碰巧起到了同样的效果而已,然而完全体现不出用意在何
    另外INETADDR_ANY只是为了从多IP主机的哪个IP连接上来都能接受,这是常见情况。要是非常见情况,只接受从特定IP连上来的连接呢?你bzero? Reply
    @Anonymous: 补充了 sockaddr_in 结构体的定义. Reply
    @Anonymous: 我要绑定的是 127.0.0.1, 不是 ANY. Reply

Leave a Comment