gpt4 book ai didi

c++ - 从字符串流复制到 char * 数组返回作为函数参数

转载 作者:行者123 更新时间:2023-11-28 00:56:51 25 4
gpt4 key购买 nike

我正在使用 Winsock2 试验 HTTP 协议(protocol)。我正在处理一个函数

int recv_data(const char *hostname, char *resp);

该函数旨在向给定主机发送 HTTP HEAD 请求,然后接收响应。它在指针 resp 处分配内存并在返回响应接收到的字节总数之前将响应复制到那里。

这是我的接收循环:

int recv_data(const char *hostname, char *resp)
{
int totalRecvd = 0;
stringstream sStream;
while (true)
{
char buffer[MAX_HEADER_SIZE];
int retValue = recv(s, buffer, MAX_HEADER_SIZE, 0);
if (retValue == 0)
break; // connection has been closed
else if (retValue == SOCKET_ERROR)
throw RecvException("http_headreq() unable to receive data");
else //
{
buffer[retValue] = 0; // append null terminator
sStream << buffer; // dump buffer into stream
totalRecvd += retValue + 1; // tally received bytes
}
}

/** Allocate and read entire read stream into memory */
resp = new char[totalRecvd + 1];
strcpy(resp, sStream.str().c_str());
return totalRecvd);
}

所有这些都工作得很好而且如果我此时输出 resp 它输出就很好。如果我在函数显然返回后尝试输出 resp,我就会遇到问题。我不认为这应该是正常情况,如果我没记错的话,我相信这与我使用 stringstream 临时存储响应有关。我想我已经在某处读到有关 stringstream 收集的超出范围的数据。

我希望我能以这种方式设置这个函数,调用者只需传入一个 char* 并且函数将分配正确数量的内存(这在运行时根据主机和数量确定) recv() 返回的字节。无论如何,我是否可以从内存中的字符串流中获取一个永久拷贝作为 char 数组,并且在函数返回并且字符串流超出范围后指针是错误的?

[编辑]:下面是我的问题中包含的解决方案,任何希望将其重新用于 Winsock2 proramming 的人都可以使用它,似乎效果很好。将从服务器接收数据,直到 recv() 返回 0 时关闭连接。解决方案是传递对指针的引用,因为 new 运算符更改指针并且该更改不会在函数返回后反射(reflect)出来,除非它被传递通过引用。

int recv_data(SOCKET s, char *&data)
{
int totalRecvd = 0;
std::stringstream sStream;
while (true)
{
char buffer[MAX_HEADER_SIZE];
int retValue = recv(s, buffer, MAX_HEADER_SIZE, 0);
if (retValue == 0)
break; // connection has been closed
else if (retValue == SOCKET_ERROR)
throw RecvException("http_headreq() unable to receive data");
else //
{
buffer[retValue] = 0; // append null terminator
sStream << buffer; // dump buffer into stream
totalRecvd += retValue + 1; // tally received bytes
}
}

/** Allocate and read entire read stream into memory */
data = new char[totalRecvd + 1];
strcpy_s(data, totalRecvd, sStream.str().c_str());
data[totalRecvd] = 0;
return totalRecvd;
}

最佳答案

resphttp_req 函数中的局部变量。更新 resp 的值将不会在 http_req 之外产生任何影响。这一行:

resp = new char[totalRecvd + 1];

只会产生局部影响。

试试这个签名:

int http_req(const char *hostname, char *&resp);


更好的是,尝试以 C++ 方式返回数据:

std::string http_req(const std::string& hostname) {
...
return sStream.str()
}

关于c++ - 从字符串流复制到 char * 数组返回作为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10628439/

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