为啥我们在套接字编程c中使用memset将结构填充为0?
Posted
技术标签:
【中文标题】为啥我们在套接字编程c中使用memset将结构填充为0?【英文标题】:Why we use memset to fill the structure with value 0, in socket programming c?为什么我们在套接字编程c中使用memset将结构填充为0? 【发布时间】:2018-12-28 05:49:17 【问题描述】: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 很重要?
【问题讨论】:
【参考方案1】:除非变量被声明为静态存储持续时间,否则它们在创建时将具有一个任意值。因此,在使用它们之前将它们设置为一个已知值总是一个好主意。
例如,如果您在socket()
之后的下一步是connect()
或bind()
,他们将非常希望分别为客户端或服务器提供特定的结构值。
其实和函数没什么区别:
void xyzzy(void)
int plugh;
printf("%d\n", plugh);
因为它可以打印任何值。
【讨论】:
【参考方案2】:继续@paxdiablo 的解释 -
您可以使用初始值定义struct
的const
static
实例。
static const struct sockaddr_in EmptyStruct;
结构初始化器可用于设置所需的初始值(如 memset 一样可以全为 0)
然后每次你想重置结构时,你可以通过
servaddr = EmptyStruct;
cliaddr = EmptyStruct;
【讨论】:
以上是关于为啥我们在套接字编程c中使用memset将结构填充为0?的主要内容,如果未能解决你的问题,请参考以下文章