2013-01-21 17 views
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

你的錯誤是在這裏:

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

而是執行此操作:

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

否則你歸零的servaddr指針,(即把它變成NULL)。當你嘗試和使用它時,它會爆炸。

同樣,你需要改變你的memcpy調用。

+0

+1打我吧=) – paddy

+0

同意。無論如何,使用'calloc()'而不是'malloc()'分配**和**初始化'servaddr'引用的結構會更簡單(甚至更安全)。那麼對memset()的調用就沒有必要了。 – alk