gpt4 book ai didi

c - 在没有 bzero 的 sockaddr_in 上套接字绑定(bind)失败

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:37 24 4
gpt4 key购买 nike

我写了一个只绑定(bind)到指定 ip:port 的小套接字程序,但是如果 struct sockaddr_in 不是 bzero 并且 gcc 带有选项 -O2,则 bind() 失败。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>

int main(int argc, char **argv){
struct sockaddr_in addr;
//bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons((unsigned short)9009);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

int sock;
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket error");
exit(0);
}
if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1){
printf("socket error: %d, %s\n", errno, strerror(errno));
exit(0);
}

return 0;
}

请注意 bzero(&addr, sizeof(addr)); 被注释掉了,我打算由每个成员初始化 sockadd_in。编译运行:

$ gcc a.c; ./a.out
OK

$ gcc -O2 a.c; ./a.out
socket error: 49, Can't assign requested address

我们可以知道struct sockadd_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() 的实现是否取决于 sockaddr_in.sin_zero 是否被清除?

编辑:Mac OS X, Darwin 内核版本 12.4.0 X86_64

最佳答案

名称绑定(bind)中使用的规则因地址系列而异。在 struct sockaddr_in 中还有这个 sin_zero 字段,有些人声称必须将其设置为零。其他人对此没有任何声明(Linux 文档甚至根本没有提及),还有其他文档声称 sin_zero 已从 struct sockaddr_in 中删除, 我试过 bzero 评论和未评论。注释的版本在本地网络中有时工作良好,但未注释的版本在本地网络或非本地网络中始终有效。所以我想 bzeroing 是个好习惯。

关于c - 在没有 bzero 的 sockaddr_in 上套接字绑定(bind)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com