- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
是否有明确的指南说明我们必须出于特定原因将 sockaddr_in 结构初始化为零?
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
每当我查看真实代码或示例或书籍时,它总是具有类似于以下的代码结构:
struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo));
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);
我知道一些消息来源说 char sin_zero[8]
成员在那里用于填充并且应该设置为零但为什么要将其余部分归零。特别是当它们在大多数情况下在接下来的几行声明中被初始化时。甚至关于 sin_zero 成员的 beej 编程指南 said it is not mandatory to zero them out anymore .我已经搜索了一个解释,但没有找到任何要点。这stack overflow question对初始化本身有一些不同的建议,但没有解释为什么需要调零。
这是遗留的做法还是有一些真正的原因我错过了?感谢任何引用。
最佳答案
将其视为默认构造函数,即将数据初始化为已知值(在本例中为 0)。这有助于缓解使用 POD 时与未初始化数据相关的问题,例如忘记设置成员,尽管 memset
并不是真正必需的,您可以使用 sockaddr_in 对结构进行值初始化foo{};
(顺便说一句,这也会在幕后产生更好的汇编代码,因为编译器可以movq 0
一切而不是调用memset
,不是说它'在 99% 的情况下会有很大的不同)。
如果您完全确定要设置所有成员,那么这并不是绝对必要的,尽管如果您忘记初始化某些东西,它可以帮助您及早发现错误。
关于c++ - 为什么 memset sockaddr_in 为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666186/
因此,我试图读取二进制文件,其中字节以网络字节顺序排列。在文件中,它们包含为套接字编程创建结构sockaddr_in所需的信息。这些文件的排列方式是,前4个字节代表IPv4地址,后2个字节代表端口号(
我想做一个小型的ECHO服务器,但是这段代码在通过sendto时一直返回-1,我不知道为什么。 它总是传递到 perror 并打印地址族不支持谁能解释一下为什么? 这是我的代码: sock = soc
我现在正在用 C 语言创建一个服务器/客户端系统,我在客户端部分遇到了一些麻烦。据我所知,我需要使用 sockaddr_in 才能连接到服务器。但是,我每次都遇到段错误。我相信 sockaddr_in
我正在解决一些静态分析缺陷,而导致我出现问题的就是这个缺陷。 SOCKADDR_IN m_stLclAddr; SOCKADDR_IN is a member of the WinSock API 缺
我有一段代码,很久以前在某个环境下工作过。我很确定它是一台 FreeBSD 机器,所以我得到了 FreeBSD 8.3,我正在尝试制作这个文件,但它不工作。 当我尝试编译它时,它会提示: f.c: I
我正在遵循 beej 的网络指南,它进展得非常好,因为我对所有内容都非常了解,而且他解释得很好。但是,当我想测试他向我展示的一些很酷的东西时,它不会起作用! :( 我不确定 sockaddr_in 到
这是 netinet/in.h 中定义的 internet(IPv4) 套接字地址结构 struct sockaddr_in { uint8_t sin_len; s
作为接收struct ifreq *ifr参数的函数的一部分,如果我声明struct sockaddr_in name;,程序会编译,但如果我命名变量struct sockaddr_in ifr_ad
我正在创建一个小型的发送方和接收方应用程序,它将其名称广播到多播组中的所有其他应用程序,同时还接收其他应用程序的名称。 我想我现在已经完成了发送部分,如下所示: if (sendto(sock, me
目前我正在构建一个点对点网络架构,并且正处于创建一个接收函数的阶段,该函数将接受来自网络上多个客户端的消息。本质上,当 recvfrom 函数被调用时——最近向主客户端发送消息的客户端的地址被加载到一
对于我的一门类(class),我必须对服务器和客户端进行编程,并且我们获得了一些示例代码以供使用。这是我感到困惑的片段: main() { int sock, sock_current, c
我在 C 编程方面相对较新,尤其是在套接字编程方面,但我花了很多时间试图帮助自己解决这个问题,但没有找到任何东西,我希望有人能够提供帮助。所以这就是问题所在(我只写了我有问题的那一行) #includ
在作为connect() 的函数中,最后一个参数是sockaddr_in 结构的大小。 很好,但是 sin_zero 未使用(系统不会像我在 stackoverflow.com/questions/2
如果我需要获取 IP 的主机名,我应该使用哪个端口? getnameinfo() 从哪里获取主机名? struct sockaddr_in sa; sa.sin_family = AF_INET
无论我在哪里看,我都会看到以下代码: struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INE
我尝试使用 struct sockaddr_in sin; 但如果我使用它,我会得到 Variable has incomplete type 'struct sockaddr_in' 和 Forw
我在谷歌上搜索了一下,有人说“为了与 struct sockaddr 保持相同的大小”。但是内核不会直接使用 sockaddr(对吧?)。使用时。内核会将其转换回原来的样子。那么为什么需要零填充? s
var sa_tab:[sockaddr?] = [sockaddr](repeating: sockaddr(), count: Int(RTAX_MAX)) let addr:sockaddr =
我是 C 和套接字编程的新手,仍然在 sockaddr_in 中苦苦挣扎结构体: struct sockaddr_in { short sin_family; /*
当我初始化变量时,我会这样做。 int i = 0; char *myText = NULL; 那么,如何初始化struct sockaddr_in类型变量? struct sockaddr_in a
我是一名优秀的程序员,十分优秀!