allocate the memory of the http request data
I'm currently doing a program in c++ related to windows socket.
On the part where I'm going to receive the answer from an http request and put the data inside of a buffer, I declared the size of the buffer which is 10000, my question is how can I allocate memory during runtime and will no need to declare the size of the buffer during compiling?
Initial code for receiving the data from http request:
char buffer[10000];
// Receiving and Displaying an answer from the Web Server
ZeroMemory(buffer, sizeof(buffer));
while ((dataLen = recv(Socket, buffer, sizeof(buffer), 0) > 0))
{
int i = 0;
while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') {
cout << buffer[i];
i += 1;
}
}
thanks for the help!
c++ winsock allocation
|
show 2 more comments
I'm currently doing a program in c++ related to windows socket.
On the part where I'm going to receive the answer from an http request and put the data inside of a buffer, I declared the size of the buffer which is 10000, my question is how can I allocate memory during runtime and will no need to declare the size of the buffer during compiling?
Initial code for receiving the data from http request:
char buffer[10000];
// Receiving and Displaying an answer from the Web Server
ZeroMemory(buffer, sizeof(buffer));
while ((dataLen = recv(Socket, buffer, sizeof(buffer), 0) > 0))
{
int i = 0;
while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') {
cout << buffer[i];
i += 1;
}
}
thanks for the help!
c++ winsock allocation
Please, usestd::vector<char>
.
– Swordfish
Nov 21 at 3:23
hi @Swordfish thanks! also, can I use new and delete operator?
– frrelmj
Nov 21 at 3:34
can I use new and delete operator? -- Over usingvector
? That's like asking "can I use candles instead of a flashlight?"
– PaulMcKenzie
Nov 21 at 3:36
Of course you can try and shoot yourself in the foot, but you really don't want to.
– Swordfish
Nov 21 at 3:36
Suggestion: replacebuffer[i] >= 32
withbuffer[i] >= ' '
. More portable and the intent is clearer. Fear the Magic Number.
– user4581301
Nov 21 at 3:39
|
show 2 more comments
I'm currently doing a program in c++ related to windows socket.
On the part where I'm going to receive the answer from an http request and put the data inside of a buffer, I declared the size of the buffer which is 10000, my question is how can I allocate memory during runtime and will no need to declare the size of the buffer during compiling?
Initial code for receiving the data from http request:
char buffer[10000];
// Receiving and Displaying an answer from the Web Server
ZeroMemory(buffer, sizeof(buffer));
while ((dataLen = recv(Socket, buffer, sizeof(buffer), 0) > 0))
{
int i = 0;
while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') {
cout << buffer[i];
i += 1;
}
}
thanks for the help!
c++ winsock allocation
I'm currently doing a program in c++ related to windows socket.
On the part where I'm going to receive the answer from an http request and put the data inside of a buffer, I declared the size of the buffer which is 10000, my question is how can I allocate memory during runtime and will no need to declare the size of the buffer during compiling?
Initial code for receiving the data from http request:
char buffer[10000];
// Receiving and Displaying an answer from the Web Server
ZeroMemory(buffer, sizeof(buffer));
while ((dataLen = recv(Socket, buffer, sizeof(buffer), 0) > 0))
{
int i = 0;
while (buffer[i] >= 32 || buffer[i] == 'n' || buffer[i] == 'r') {
cout << buffer[i];
i += 1;
}
}
thanks for the help!
c++ winsock allocation
c++ winsock allocation
asked Nov 21 at 3:13
frrelmj
24
24
Please, usestd::vector<char>
.
– Swordfish
Nov 21 at 3:23
hi @Swordfish thanks! also, can I use new and delete operator?
– frrelmj
Nov 21 at 3:34
can I use new and delete operator? -- Over usingvector
? That's like asking "can I use candles instead of a flashlight?"
– PaulMcKenzie
Nov 21 at 3:36
Of course you can try and shoot yourself in the foot, but you really don't want to.
– Swordfish
Nov 21 at 3:36
Suggestion: replacebuffer[i] >= 32
withbuffer[i] >= ' '
. More portable and the intent is clearer. Fear the Magic Number.
– user4581301
Nov 21 at 3:39
|
show 2 more comments
Please, usestd::vector<char>
.
– Swordfish
Nov 21 at 3:23
hi @Swordfish thanks! also, can I use new and delete operator?
– frrelmj
Nov 21 at 3:34
can I use new and delete operator? -- Over usingvector
? That's like asking "can I use candles instead of a flashlight?"
– PaulMcKenzie
Nov 21 at 3:36
Of course you can try and shoot yourself in the foot, but you really don't want to.
– Swordfish
Nov 21 at 3:36
Suggestion: replacebuffer[i] >= 32
withbuffer[i] >= ' '
. More portable and the intent is clearer. Fear the Magic Number.
– user4581301
Nov 21 at 3:39
Please, use
std::vector<char>
.– Swordfish
Nov 21 at 3:23
Please, use
std::vector<char>
.– Swordfish
Nov 21 at 3:23
hi @Swordfish thanks! also, can I use new and delete operator?
– frrelmj
Nov 21 at 3:34
hi @Swordfish thanks! also, can I use new and delete operator?
– frrelmj
Nov 21 at 3:34
can I use new and delete operator? -- Over using
vector
? That's like asking "can I use candles instead of a flashlight?"– PaulMcKenzie
Nov 21 at 3:36
can I use new and delete operator? -- Over using
vector
? That's like asking "can I use candles instead of a flashlight?"– PaulMcKenzie
Nov 21 at 3:36
Of course you can try and shoot yourself in the foot, but you really don't want to.
– Swordfish
Nov 21 at 3:36
Of course you can try and shoot yourself in the foot, but you really don't want to.
– Swordfish
Nov 21 at 3:36
Suggestion: replace
buffer[i] >= 32
with buffer[i] >= ' '
. More portable and the intent is clearer. Fear the Magic Number.– user4581301
Nov 21 at 3:39
Suggestion: replace
buffer[i] >= 32
with buffer[i] >= ' '
. More portable and the intent is clearer. Fear the Magic Number.– user4581301
Nov 21 at 3:39
|
show 2 more comments
1 Answer
1
active
oldest
votes
Probably, you want something like this:
std::vector<uint8_t> req_body;
/* temporary buffer */
char buffer[1024];
/* count of read bytes per chunk */
size_t read = 0;
while (read = recv(Socket, buffer, sizeof(buffer), 0))
{
size_t old_size = req_body.size();
/* expand body size */
req_body.resize(old_size + read);
/* write new chunk of data to body */
memcpy(req_body.data() + old_size, buffer, read);
}
/* handle request */
req_body.clear();
Also, remind that there are no guarantee for completeness of data. So it is better to wait for 'Content-Length' header, then find end of headers block and wait until full length will be received before clear the body.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53404769%2fallocate-the-memory-of-the-http-request-data%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Probably, you want something like this:
std::vector<uint8_t> req_body;
/* temporary buffer */
char buffer[1024];
/* count of read bytes per chunk */
size_t read = 0;
while (read = recv(Socket, buffer, sizeof(buffer), 0))
{
size_t old_size = req_body.size();
/* expand body size */
req_body.resize(old_size + read);
/* write new chunk of data to body */
memcpy(req_body.data() + old_size, buffer, read);
}
/* handle request */
req_body.clear();
Also, remind that there are no guarantee for completeness of data. So it is better to wait for 'Content-Length' header, then find end of headers block and wait until full length will be received before clear the body.
add a comment |
Probably, you want something like this:
std::vector<uint8_t> req_body;
/* temporary buffer */
char buffer[1024];
/* count of read bytes per chunk */
size_t read = 0;
while (read = recv(Socket, buffer, sizeof(buffer), 0))
{
size_t old_size = req_body.size();
/* expand body size */
req_body.resize(old_size + read);
/* write new chunk of data to body */
memcpy(req_body.data() + old_size, buffer, read);
}
/* handle request */
req_body.clear();
Also, remind that there are no guarantee for completeness of data. So it is better to wait for 'Content-Length' header, then find end of headers block and wait until full length will be received before clear the body.
add a comment |
Probably, you want something like this:
std::vector<uint8_t> req_body;
/* temporary buffer */
char buffer[1024];
/* count of read bytes per chunk */
size_t read = 0;
while (read = recv(Socket, buffer, sizeof(buffer), 0))
{
size_t old_size = req_body.size();
/* expand body size */
req_body.resize(old_size + read);
/* write new chunk of data to body */
memcpy(req_body.data() + old_size, buffer, read);
}
/* handle request */
req_body.clear();
Also, remind that there are no guarantee for completeness of data. So it is better to wait for 'Content-Length' header, then find end of headers block and wait until full length will be received before clear the body.
Probably, you want something like this:
std::vector<uint8_t> req_body;
/* temporary buffer */
char buffer[1024];
/* count of read bytes per chunk */
size_t read = 0;
while (read = recv(Socket, buffer, sizeof(buffer), 0))
{
size_t old_size = req_body.size();
/* expand body size */
req_body.resize(old_size + read);
/* write new chunk of data to body */
memcpy(req_body.data() + old_size, buffer, read);
}
/* handle request */
req_body.clear();
Also, remind that there are no guarantee for completeness of data. So it is better to wait for 'Content-Length' header, then find end of headers block and wait until full length will be received before clear the body.
answered Nov 21 at 19:24
kerrytazi
28627
28627
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53404769%2fallocate-the-memory-of-the-http-request-data%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Please, use
std::vector<char>
.– Swordfish
Nov 21 at 3:23
hi @Swordfish thanks! also, can I use new and delete operator?
– frrelmj
Nov 21 at 3:34
can I use new and delete operator? -- Over using
vector
? That's like asking "can I use candles instead of a flashlight?"– PaulMcKenzie
Nov 21 at 3:36
Of course you can try and shoot yourself in the foot, but you really don't want to.
– Swordfish
Nov 21 at 3:36
Suggestion: replace
buffer[i] >= 32
withbuffer[i] >= ' '
. More portable and the intent is clearer. Fear the Magic Number.– user4581301
Nov 21 at 3:39