为什么我们在socket编程c中使用memset来填充值为0的结构?
Why we use memset to fill the structure with value 0, in socket programming c?
struct sockaddr_in servaddr, cliaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
在我之前关于结构的工作中,我没有用值 0 填充结构,但是在套接字中,我们总是在使用它之前重置、填充 0 结构。为什么填充 0 结构很重要?
除非变量被声明为静态存储持续时间,否则它们在创建时将具有任意值。因此,在使用它们之前将它们设置为已知值总是一个好主意。
例如,如果您在 socket()
之后的下一步是 connect()
或 bind()
,他们将非常希望分别为客户端或服务器提供特定的结构值。
其实和函数没什么区别:
void xyzzy(void) {
int plugh;
printf("%d\n", plugh);
}
因为它可以打印 任何 值。
@paxdiablo 解释的延续 -
您可以使用初始值定义 struct
的 const
static
实例。
static const struct sockaddr_in EmptyStruct;
结构初始化程序可用于设置所需的初始值(可以是 memset 中的全 0)
然后每次你想重置结构时你可以通过
servaddr = EmptyStruct;
cliaddr = EmptyStruct;
struct sockaddr_in servaddr, cliaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
在我之前关于结构的工作中,我没有用值 0 填充结构,但是在套接字中,我们总是在使用它之前重置、填充 0 结构。为什么填充 0 结构很重要?
除非变量被声明为静态存储持续时间,否则它们在创建时将具有任意值。因此,在使用它们之前将它们设置为已知值总是一个好主意。
例如,如果您在 socket()
之后的下一步是 connect()
或 bind()
,他们将非常希望分别为客户端或服务器提供特定的结构值。
其实和函数没什么区别:
void xyzzy(void) {
int plugh;
printf("%d\n", plugh);
}
因为它可以打印 任何 值。
@paxdiablo 解释的延续 -
您可以使用初始值定义 struct
的 const
static
实例。
static const struct sockaddr_in EmptyStruct;
结构初始化程序可用于设置所需的初始值(可以是 memset 中的全 0)
然后每次你想重置结构时你可以通过
servaddr = EmptyStruct;
cliaddr = EmptyStruct;