这是我的问题:
我正在尝试使用适当的信息填充套接字地址结构,以便我可以在程序中使用它来处理服务器和客户端之间的通信。这是服务器代码的一部分。问题在于它是段错误。当我运行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;
}
答案 0 :(得分:1)
你的错误在这里:
memset((void *) &servaddr, 0, (size_t)sizeof(servaddr));
请改为:
memset((void *) servaddr, 0, (size_t)sizeof(*servaddr));
否则,您将servaddr的指针归零(即将其变为NULL)。当你尝试使用它时会爆炸。
同样,您需要更改您的memcpy电话。