1
這裏是我的問題:段錯誤分配AF_INET到SOCKADDR_IN結構的sin_family屬性時
我試圖填補套接字地址結構與相應的信息,這樣我可以在程序之間的手柄通信使用一個服務器和一個客戶端。這是服務器代碼的一部分。問題在於它存在段錯誤。當我運行gdb
時,它表示在將AF_INET
分配給servaddr
結構的sin_family
屬性時發生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打我吧=) – paddy
同意。無論如何,使用'calloc()'而不是'malloc()'分配**和**初始化'servaddr'引用的結構會更簡單(甚至更安全)。那麼對memset()的調用就沒有必要了。 – alk