将AF_INET分配给sockaddr_in结构的sin_family属性时的Segfault

时间:2013-01-21 00:44:07

标签: c sockets network-programming

这是我的问题:

我正在尝试使用适当的信息填充套接字地址结构,以便我可以在程序中使用它来处理服务器和客户端之间的通信。这是服务器代码的一部分。问题在于它是段错误。当我运行gdb时,它表示当我将AF_INET分配给sin_family结构的servaddr属性时会发生seg错误。

代码:

servaddr->sin_family = (short)(AF_INET); 

我似乎无法弄清楚为什么会这样。

这是完整的代码:

// Function Prototypes
struct sockaddr_in* getServerInfo(char[]);

int main()
{

    char hostname[MAXHOSTNAMELEN];
    struct sockaddr_in* servaddr = getServerInfo(hostname);

 return 0;
} // End main

struct sockaddr_in* getServerInfo(char hostname[])
{

    struct sockaddr_in* servaddr = malloc((size_t)sizeof(struct sockaddr_in));
    gethostname(hostname, 32);
    struct hostent *hostptr;
    hostptr = gethostbyname(hostname);

    memset((void *) &servaddr, 0, (size_t)sizeof(servaddr));
    servaddr->sin_family = (short)(AF_INET);
    memcpy((void *)& servaddr->sin_addr, (void *) hostptr->h_addr, hostptr->h_length);
    servaddr->sin_port = htons((u_short)8000);

    return servaddr;
}

1 个答案:

答案 0 :(得分:1)

你的错误在这里:

memset((void *) &servaddr, 0, (size_t)sizeof(servaddr));

请改为:

memset((void *) servaddr, 0, (size_t)sizeof(*servaddr));

否则,您将servaddr的指针归零(即将其变为NULL)。当你尝试使用它时会爆炸。

同样,您需要更改您的memcpy电话。