2011-02-10 71 views
0

當執行以下,GDB說,它的失敗在data()最後一行:這個函數調用是否有任何理由不起作用?

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: 13 at address: 0x0000000000000000 
0x00000001000021ee in data (srvr=Cannot access memory at address 0x6567612d726572fd 
) at /Users/Documents/w11/cs176b/mftp/data.c:121

你看不到任何理由爲什麼它會失敗?

全球CONTROL.C中,最終得到strcpy()倒是一個IP地址XXXX

char passive_ip[25] = ""; 

稱爲CON​​TROL.C

data(passive_ip, passive_port); 

data.c

void data(char* srvr, int prt) { 
    printf("In Data: connecting to %s:%i", srvr, prt); 

    struct hostent *hp = gethostbyname(srvr); 

    if (hp == NULL) { 
     printf("gethostbyname() failed\n"); 
    } else { 
     printf("%s = ", hp->h_name); 
     unsigned int i=0; 
     // while (hp -> h_addr_list[i] != NULL) { 
     printf("%i %s ",i, inet_ntoa(*(struct in_addr*)(hp -> h_addr_list[0]))); 
     //  i++; 
     // } 
     printf("\n"); 
    } 

    char hostname[15]; 
    strcpy(hostname, inet_ntoa(*(struct in_addr*)(hp -> h_addr_list[0]))); 


    int sockfd; 
    int len; 
    struct sockaddr_in address; 
    int result; 
    char* buffer; 


    /* Create a socket for the client. */ 
    sockfd = socket(PF_INET, SOCK_STREAM, 0); 

    /* Name the socket, as agreed with the server. */ 
    address.sin_family = AF_INET; 
    address.sin_addr.s_addr = inet_addr( hostname ); 
    address.sin_port = htons(prt); 
    len = sizeof(address); 

    /* Now connect our socket to the server's socket. */ 
    result = connect(sockfd, (struct sockaddr *)&address, len); 

    if(result == -1) { 
     perror("oops (data): client3"); 
     exit(1); 
    } 

    read(sockfd, buffer, MY_BUFFER_SIZE); 


} // this is line 121 
+0

聽起來也許`數據()`函數蕭條堆棧 – 2011-02-10 02:59:00

+0

GDB說,它的失敗在數據的最後一行:原因:13地址:0x0000000000000000 0x00000001000021ee數據(SRVR =地址無法訪問內存0x6567612d726572fd )在/Users/brian/Documents/w11/cs176b/mftp/data.c:121 ...「srvr」是該函數的參數... hmmm – 2011-02-10 03:01:29

回答

4

內第一個我會做的事情正在改變:

char hostname[15]; 

到:

char hostname[16]; 

你很可能被溢出的緩衝區,這將導致堆棧損壞。完整的IPv4地址需要字符:nnn.nnn.nnn.nnn加上終止\0。事實上,如果你對處理IPv6沒什麼興趣,你可能不應該使用這些電話 - 我非常確定他們在這個世界上表現不佳。但這是一個不同的問題。


其他問題,您有(這是幾乎可以肯定你崩潰的原因),就是你做的事:

char *buffer; 
: 
read(sockfd, buffer, MY_BUFFER_SIZE); 

沒有該緩衝區實際分配內存,從而使buffer會指向一些任意位置。無論是使用:

char buffer[MY_BUFFER_SIZE]; 

或:

char *buffer = malloc (MY_BUFFER_SIZE); 

記住要檢查分配失敗和自由時,它不再需要。

2

函數data()的最後一行是read()。您正試圖將數據讀入buffer;您還沒有爲buffer分配任何存儲空間,所以指針(幸運地爲您)NULL,導致崩潰。

相關問題