2011-08-06 21 views
0

我一直試圖在這種情況下,在同一臺機器上運行,發送和接收結構使用UDP在同一臺機器和服務器和客戶端上,並有着共同的結構定義(使用頭文件)傳遞結構。使用UDP

hostent結構DEFN(UNIX內置型):

struct hostent{ 
     char *h_name; 
     char **h_aliases; 
     int h_addrtype; 
     int h_length; 
     char **h_addr_list; 
    } 

服務器代碼段如下:

struct hostent* resolved_host = DNS_translate(DNSname); 
    if((numbytes = sendto(sockfd, (void*)&resolved_host, sizeof(struct hostent), 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr))) == -1) 
    { 
     perror("sendto failed"); 
     exit(EXIT_FAILURE); 
    } 

客戶端代碼段如下:

struct hostent resolved_host; 

    int addr_len = sizeof(struct sockaddr); 

    if((numbytes = recvfrom(sockfd, (void*)&resolved_host, sizeof(struct hostent), 0, (struct sockaddr *)&server_addr, &addr_len)) == -1) 
    { 
     perror("recvfrom failed"); 
     exit(EXIT_FAILURE); 
    } 

服務器發送和客戶端正常收到(沒有錯誤發生)。 * resolved_host *結構填充到服務器中,可以毫無問題地訪問其所有數據。 但是,如果我現在嘗試在客戶端中使用* resolved_host *結構,我會遇到seg故障。例如:

printf("Name : %s\n", resolved_host.h_name); 

產生一個seg故障。 (但在服務器工作)

回答

2

該結構包含指針 - 所以,當你在UDP複製結構你只複製值的那些指針(即地址其他一些數據片)而不是實際的數據本身。

當您收到服務器的三分球,他們不再意味着什麼 - 這些指針地址是毫無意義的其他程序。

+0

哦,謝謝,它完全忽略我的腦海裏。我現在覺得很愚蠢:| – Arun

1

您正在發送指針。即使在同一臺機器上,這些在不同的地址空間中也是無效的。