在进行socket连接时,为什么要对socket地址结构执行清0操作?

1.我看socket连接的时候 书上都会用memset或者bzero函数对地址结构体进行清零操作

bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
inet_pton(AF_INET, ip, &server_addr.sin_addr);
server_addr.sin_port = htons(port);

但是去掉第一句之后并不会产生什么影响 想知道这个清零的意义在哪里

阅读 2.9k
1 个回答

大部分 system call 都使用的是 struct sockaddr 结构,而不是我们使用的 struct sockaddr_in 等结构,所以我们通常在调用 system call 时都会进行 类型转换。

如果你观察下 struct sockaddr_in 的结构,你会发现它有一个 sin_zero 的成员,正如它的名字,这个成员就是要置零,其存在的意义就是要和 struct sockaddr 结构对齐,长度一致。

有的系统可能不在意它是否置零,但有的系统会做判断的,可能会造成一些未定义的行为。所以,为了兼容性,还是要置零的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题