使用套接字发送 POST 请求,但占用大量内存功率
Sending a POST request using a Socket, but using much of memory power
这个长代码使用套接字发送POST请求,整个代码没有任何抱怨,但我现在面临的是,它消耗了大量的CPU功率,使用了太多的内存(RAM)
我可以看到这一点,因为我的笔记本电脑变热得非常快,并且通过查看我的Mac。
我试图找到错误或在哪里,那个非常大的内存问题,但不能。我花了一个多月的时间试图自己修复它,但老实说,我不知道我在做什么。
我是如此绝望,以至于我把各种解放的梅托德......甚至它错了......只是为了看看这是否改变了,但什么都没有。
所以现在我不知道有什么问题或如何解决这个问题,请帮助我......
去更新代码与选择,时刻...尝试先清理它
第一件事:不要混合使用 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.0rn" // POST or GET, both tested and works. Both HTTP 1.0 HTTP 1.1 works, but sometimes
"Host: %srn" //oth HTTP 1.0 HTTP 1.1 works, but sometimes HTTP 1.0 works better in localhost type
"Content-type: application/x-www-form-urlencodedrn"
"Content-length: %drnrn"
"%srn", page, host, (unsigned int)strlen(poststr), poststr);
if (write(sockfd, sendline, strlen(sendline))>= 0)
{
while ((n = read(sockfd, recvline, MAXLINE)) > 0)
{
recvline[n] = ' ';
if(fputs(recvline,stdout) ==EOF) { cout << ("fputs erros"); }
ptr = strstr(recvline, "rnrn");
strip(ptr, "rnrn");
// 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 foundn");
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
}
}
您在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++ = ' ';
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() 与 free() 一起使用
- new() 与 delete() 一起使用
这与使用的内存无关,但与其直接调用 read()/write(),不如使用 select() 知道它何时准备好被读取或写入。这里有一个相关的问题:https://stackoverflow.com/a/10800029/1158895
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 使用套接字发送 POST 请求,但占用大量内存功率