2012-05-30 13 views
-1

这个长代码使用Socket发送POST请求,整个代码没有任何抱怨,但我现在面临的是,它吃东西大量的CPU功耗,使用太多的内存(RAM)使用套接字发送POST请求,但使用大量内存电源

我可以看到,因为我的笔记本电脑变得非常快,并通过查看我的Mac。

我试图找到错误或其中,那个非常大的内存问题是,但不能。我花了一个多月的时间尝试着自己解决这个问题,但不知道我在说些什么来说实话。

我是如此绝望,我的推杆都挺释放梅托德的..甚至是错误..只是,看看是否能做出了改变,但无济于事..

所以现在我不知道自己做错了什么或如何解决此问题,请帮我...

去更新与选择,时刻代码...试图把它清理干净第一

+1

这里的一个特技:只使用的C或C++之一。这段代码是两个糟糕的坏坏混合物。它不会仅调用未定义的行为*,因为它存在泄漏*并且不良清理代码从不运行。 –

+0

我同意你的看法,但我试图修复大内存泄漏第一个 – user1417815

+0

问题是在数据库()函数 - memleak在最后,看到我的答案。您也可以通过删除这些例程中未使用的strip_copy()来清除代码。 –

回答

4

第一件事:不要混合malloc()和delete []。他们可能会或可能不会引用相同的内存分配器。所以使用malloc()/ free()或new char []/delete []对。

问题出在这里(在Database()函数中):你有一个可怕的memleak。不要像这样分配内存来传递结果。更好使用缓冲区。你的程序是多线程的,所以使用堆栈上的缓冲区。不要在任何你未分配的东西上调用delete [](var声明,如“char Buf [100];”是而不是的分配)。

新版本(I省略main()和条带()函数还包括的):

#define MAX_ECHO_SIZE (1024) 
#define MAX_RESPONSE_SIZE (1024) 

void process_http(int sockfd, const char *host, const char *page, const char *poststr, char* OutResponse) 
{ 
    char* ptr; 
    char sendline[MAXLINE + 1], recvline[MAXLINE + 1]; 
    ssize_t n; 

    snprintf(sendline, MAXSUB, 
     "POST %s HTTP/1.0\r\n" // POST or GET, both tested and works. Both HTTP 1.0 HTTP 1.1 works, but sometimes 
     "Host: %s\r\n"  //oth HTTP 1.0 HTTP 1.1 works, but sometimes HTTP 1.0 works better in localhost type 
     "Content-type: application/x-www-form-urlencoded\r\n" 
     "Content-length: %d\r\n\r\n" 
     "%s\r\n", page, host, (unsigned int)strlen(poststr), poststr); 

    if (write(sockfd, sendline, strlen(sendline))>= 0) 
    { 
     while ((n = read(sockfd, recvline, MAXLINE)) > 0) 
     { 
      recvline[n] = '\0'; 

      if(fputs(recvline,stdout) ==EOF) { cout << ("fputs erros"); } 
      ptr = strstr(recvline, "\r\n\r\n"); 
      strip(ptr, "\r\n\r\n"); 

      // check len for OutResponse here ? 
      snprintf(OutResponse, 6000,"%s", ptr); 
     } 
    } 
} 

int Database(const char * hname, const char * page, const char * var, const char * poststr, int port, char* EchoResponse, int MaxEchoLen){ 

    char url[MAXLINE]; 
    char response[MAX_RESPONSE_SIZE]; 

    snprintf(url, MAXLINE, "%s=%s", var, poststr); 

    short int sockfd ; 
    struct sockaddr_in servaddr; 
    struct hostent *hptr; 
    char str[MAXLINE]; 
    char** pptr; 

    hptr = gethostbyname(hname); 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (!hptr) { 
     cout << ("host not found\n"); 
     return -1; // "host not found"; 
    } 

    if (hptr->h_addrtype == AF_INET && (pptr = hptr->h_addr_list) != NULL) { 
     inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)); 
    } 
    if (sockfd >= 0 ) { 
     bzero(&servaddr, sizeof(servaddr)); 
     servaddr.sin_family = AF_INET; 
     servaddr.sin_port = htons(port); 
     inet_pton(AF_INET, str, &servaddr.sin_addr); 

     if (connect(sockfd, (SA *) & servaddr, sizeof(servaddr)) < 0) { 
      return -2; // "Server down, connect error"; 
     } 
     else { 
      process_http(sockfd, hname, page, url, &response[0], MAX_RESPONSE_SIZE); 

      int len = strlen(response)+1; 
      if(len >= MaxEchoLen) { return -3; /* buffer too small*/ } 

      // Copy the contents with 
      strcpy(EchoResponse, response); 

      /// You must not free all of char[] allocated on stack 
      close(sockfd); 

      return 0; // OK 
     } 
    } 
} 

void *multithreading1(void *ptr) { 
    char LocalEchoResponse[MAX_ECHO_SIZE]; 

    while (1) { 
      int RetCode = Database("2.107.xx.xxx", "/ajax.php", "submit", "HEllo WORLD", 80, &LocalEchoResponse[0], MAX_ECHO_SIZE); 
      /// check the error 
    } 
} 
+1

如果那是全部... –

+0

Viktor如何可以改变工作..没有问题? – user1417815

+0

-1您的快速“修复”会调用未定义的行为! –

1

你有strip_copy一个相当大的内存泄漏。无论你在回归之后放置什么,都不会执行。我惊讶编译器没有抱怨这个。 process_http()函数中的同样问题。

修复这样的:

static void strip_copy(char const *s, char *buf, const char * SPACE) 
{ 
    if (buf) 
    { 
     char *p = buf; 
     char const *q; 
     int n; 
     for (q = s; *q; q += n + strspn(q+n, SPACE)) 
     { 
      n = strcspn(q, SPACE); 
      strncpy(p, q, n); 
      p += n; 
     } 
     *p++ = '\0'; 
     buf = (char*)realloc(buf, p - buf); 
    } 
} 

// Then call it like this 
char *buf = new[1 + strlen(s)]; 
strip_copy(s, buf, ' '); 
// use buf 
delete [] buf; 

而且在process_http()

const char* process_http(int sockfd, const char *host, const char *page, const char *poststr) 
{ 
    .... 
    // delete here only what you dynamically 
    // allocated with new() BEFORE the return 
    return response; // n 
} 

并且不要混用的malloc()用delete():

  • 的malloc()去与免费()
  • new()附带delete()

这不是与所用的内存有关,而是直接调用read()/ write(),而不是直接调用read(),您应该使用select()来知道何时准备读取或写入。这里有一个相关的问题:https://stackoverflow.com/a/10800029/1158895

+0

strip_copy()不使用,谢天谢地:) –

+0

这是真的,但怎么可以'这是固定的?你能指出什么改变什么? – user1417815

+0

-1您的“修复”调用未定义的行为! –