2011-02-10 34 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,导致崩溃。

相关问题