gpt4 book ai didi

c++ - 使用 Socket 发送 POST 请求,但会占用大量内存

转载 作者:行者123 更新时间:2023-11-30 18:26:51 26 4
gpt4 key购买 nike

这段长代码正在使用 Socket 发送 POST 请求,整个代码工作正常,没有任何提示,但我现在面临的是,它消耗了大量的 cpu 功率,使用了太多的内存(RAM)

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

我试图找到错误或那个非常大的内存问题在哪里,但找不到。我花了一个多月的时间试图自己修复它,但说实话我不知道我在做什么。

我是如此绝望,以至于我使用了各种释放方法..即使它是错误的..只是为了看看这是否会带来改变,但没有任何效果..

所以现在我不知道出了什么问题或如何解决这个问题,请帮助我......

要使用 select 更新代码,时刻...尝试先清理它

最佳答案

第一件事:不要混合使用 malloc() 和 delete[]。它们可能引用也可能不引用相同的内存分配器。因此,请使用 malloc()/free() 或 new char[]/delete[] 对。

问题就在这里(在 Database() 函数中):你有一个可怕的内存泄漏。不要像这样分配内存来传递结果。更好地使用缓冲区。您的程序是多线程的,因此使用堆栈上的缓冲区。不要对不是由您分配的任何内容调用delete[](像“char Buf[100];”这样的var声明不是分配)。

新版本(我省略了 main() 和 strip() 函数。还包括):

#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
}
}

关于c++ - 使用 Socket 发送 POST 请求,但会占用大量内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10814541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com