为啥我们在套接字编程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 的解释 -

您可以使用初始值定义structconst static 实例。

static const struct sockaddr_in EmptyStruct;

结构初始化器可用于设置所需的初始值(如 memset 一样可以全为 0)

然后每次你想重置结构时,你可以通过

servaddr = EmptyStruct;
cliaddr = EmptyStruct;

【讨论】:

以上是关于为啥我们在套接字编程c中使用memset将结构填充为0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用 memset 用零填充对象后在 dynamic_cast 出现异常

为啥我们需要 RPC 编程? [关闭]

ioctl() 用于 C 中的套接字编程

c语言memset()函数

c语言里有memset()怎么用?需要啥头文件?

在 C 中通过具有正确填充和字节序的套接字发送结构