你好我在很多讨论中寻找解决方案,不幸的是没有得到任何帮助。
我有一个代理服务器从一个客户端接收请求并要求服务器响应,我遵循的步骤是:
1 - > 我向客户提出了代理请求。
2 - > 代理连接到服务器并向客户端发送响应(直到此处一切正常)。
3 - > 当我从同一客户端向代理发出第二个请求时,当代理尝试再次连接到服务器时,会发生此错误:
*`./px':free()出错:下一个大小无效(正常):0x0000000001941120已中止(核心转储)*
这是发生错误的方法:
char * readResponseFromServer(char *hostname,char *request,char *response){
int sock;
struct sockaddr_in serv_addr;
struct hostent * server;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock<0)
printEror("socket opening error");
server=gethostbyname(hostname);
if (server == NULL)
printEror ("unknown host");
printf("the server adress is %s\n",server->h_name);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(80);
if(connect(sock,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printEror("connection error");
}
int n1 = write(sock,request,strlen(request));
if (n1< 0)
printEror("ERROR writing to socket");
//reading response from server
int readed=0;
int bytesloaded=0;
int buf_size=512;
//we try to read 256 bytes each time
while( (readed = read(sock, response+ bytesloaded, buf_size)) > 0 )
{
if(bytesloaded + readed >= buf_size)//the response buffer is full , so we allocate more memory
{
buf_size = buf_size + 256;
response = (char *)realloc(response, buf_size);
}
bytesloaded += readed;
}
printf("the response is: %s",response);
close(sock);
}
特别是在这个电话中:
server=gethostbyname(hostname);
总结一下,当我按上述方法调用上述方法时,我会收到此错误。
为什么我会收到此错误?
非常感谢。
解决方案:
我使用了不同的建议来解决我的问题,我再次感谢你。
主要问题是:
并且错误不在我发布的Methode中,但是在另一种方法中,尽管程序在其他地方停止,所以我从这个问题中学到了一件事:内存错误可能来自程序中的任何地方。
所以我不得不检查我的程序,并设法找出错误记忆的位置。
答案 0 :(得分:1)
- `./px' ;: free()出错:下一个大小无效(正常):0x0000000001941120已中止(核心转储)*
在您的代码中,假设以下原型中使用的char *request
变量的内存:
char * readResponseFromServer(char *hostname,char *request,char *response){
提供并从调用函数中释放...
...然后,如果要求在被调用函数中更改缓冲区的内存,则调用者必须传递地址变量,而不是变量本身。通过这种方式,realloc()
可以在被调用函数中使用,同时提供调用者释放内存的能力。以下是使用realloc()
显示其工作原理的代码段:
void growBuffer(char ** b, int *size);//note prototype include char **, not char *
int main(void)
{
char *buf = {0};
buf = calloc(20,1);
strcpy(buf, "original string-");
int len = strlen(buf)+1;
printf("Original buf and length: %s - %d\n", buf, len);
growBuffer(&buf, &len);//caller passes address of buf: (&buf)
printf("New buf and length: %s - %d\n", buf, len);
free(buf);//caller can now safely free memory
return 0;
}
void growBuffer(char **buffer, int *size)
{
const char newContent[]={"new content requires growing buffer"};
int newlen = *size + strlen(newContent) + 1;
char *buf = realloc((*buffer), newlen );
if(buf)//always test return of [m][c][re]alloc before using
{
(*buffer) = buf; //assign new memory to buffer
strcat((*buffer), newContent);//modify string
*size = newlen;//pass back new len of string
}
}