C++ 如何为文本和Bin缓冲区设置WSABUF.buf?
我正在重构代码,以避免使用std::vector。我如何做到这一点 不知何故,WSASend()更喜欢让WSABUF.buf指向std::vector,以便它处理图像文件(.jpg、.png等) 在测试期间,image/*mimetypes返回net::ERR\u CONTENT\u LENGTH\u不匹配C++ 如何为文本和Bin缓冲区设置WSABUF.buf?,c++,http,winsock,memcpy,C++,Http,Winsock,Memcpy,我正在重构代码,以避免使用std::vector。我如何做到这一点 不知何故,WSASend()更喜欢让WSABUF.buf指向std::vector,以便它处理图像文件(.jpg、.png等) 在测试期间,image/*mimetypes返回net::ERR\u CONTENT\u LENGTH\u不匹配 byte* HttpResponse::GetResponse2(ULONG *len) { DWORD dwThreadId = GetCurrentThreadId();
byte* HttpResponse::GetResponse2(ULONG *len)
{
DWORD dwThreadId = GetCurrentThreadId();
char *buffer = (char*)malloc(DATA_BUFSIZE);
memset(buffer, 0, DATA_BUFSIZE);
std::vector<byte> binbuffer = m_sbResponse;
std::string ctstr;
ctstr.assign(contenType.begin(), contenType.end());
size_t siz = binbuffer.size();
std::string ssiz = std::to_string(siz);
strcpy_s(buffer, DATA_BUFSIZE, resp_ok);
strcat_s(buffer, DATA_BUFSIZE, "\n");
strcat_s(buffer, DATA_BUFSIZE, "Date: ");
strcat_s(buffer, DATA_BUFSIZE, "May 10, 2015");
strcat_s(buffer, DATA_BUFSIZE, "\n");
strcat_s(buffer, DATA_BUFSIZE, "Content-Type: ");
strcat_s(buffer, DATA_BUFSIZE, ctstr.c_str());
strcat_s(buffer, DATA_BUFSIZE, "\n");
strcat_s(buffer, DATA_BUFSIZE, "Content-Length: ");
strcat_s(buffer, DATA_BUFSIZE, ssiz.c_str());
strcat_s(buffer, DATA_BUFSIZE, "\n");
strcat_s(buffer, DATA_BUFSIZE, "\n");
int bufsiz = strlen(buffer) + binbuffer.size() + 1;
byte* buffer2 = (byte*)malloc(bufsiz);
memset(buffer2, 0, bufsiz);
strcpy_s((char*)buffer2, strlen(buffer)+1, buffer);
int n = strlen((char*)buffer2);
std::vector<byte>::iterator it;
for (it = binbuffer.begin(); it != binbuffer.end(); it++)
{
byte b = *it;
buffer2[n++] = b;
}
*len = strlen((char*)buffer2);
return buffer2;
}
byte*HttpResponse::GetResponse2(ULONG*len)
{
DWORD dwThreadId=GetCurrentThreadId();
char*buffer=(char*)malloc(数据大小);
memset(缓冲区,0,数据大小);
std::vector binbuffer=m_sbResponse;
std::字符串ctstr;
赋值(contenType.begin(),contenType.end());
size_t siz=binbuffer.size();
std::string ssiz=std::to_string(siz);
strcpy(缓冲区、数据大小、响应正常);
strcat(缓冲区,数据大小,“\n”);
strcat(缓冲区,数据大小,日期:);
strcat(缓冲区,数据大小,2015年5月10日);
strcat(缓冲区,数据大小,“\n”);
strcat(缓冲区,数据大小,“内容类型:”);
strcat(缓冲区,数据大小,ctstr.c_str());
strcat(缓冲区,数据大小,“\n”);
strcat(缓冲区,数据大小,“内容长度:”);
strcat_s(缓冲区,数据大小,ssiz.c_str());
strcat(缓冲区,数据大小,“\n”);
strcat(缓冲区,数据大小,“\n”);
int bufsiz=strlen(buffer)+binbuffer.size()+1;
字节*buffer2=(字节*)malloc(bufsiz);
memset(buffer2,0,bufsiz);
strcpy_s((char*)buffer2,strlen(buffer)+1,buffer);
int n=strlen((char*)buffer2);
std::vector::it迭代器;
for(it=binbuffer.begin();it!=binbuffer.end();it++)
{
字节b=*it;
缓冲区2[n++]=b;
}
*len=strlen((char*)buffer2);
返回缓冲区2;
}
我是否需要为WSA*设置一个属性来处理我要做的事情
在a中安装。请尝试类似的操作:
byte* HttpResponse::GetResponse2(ULONG *len)
{
*len = 0;
std::ostringstream oss;
oss << resp_ok << "\n"
oss << "Date: " << "May 10, 2015" << "\n";
oss << "Content-Type: " << contenType << "\n";
oss << "Content-Length: " << m_sbResponse.size() << "\n";
oss << "\n";
std::string s = oss.str();
int bufsiz = s.length() + m_sbResponse.size();
byte* buffer2 = (byte*) malloc(bufsiz);
if (buffer2)
{
std::copy(s.begin(), s.end(), buffer2);
std::copy(m_sbResponse.begin(), m_sbResponse.end(), &buffer2[s.length()]);
*len = bufsiz;
}
return buffer2;
}
实际问题是什么?使用
std::vector
没有问题,只要它在访问完WSASend()
之前保持活动状态。和<>代码> WSABUF不知道关于<代码> vector < /C> >,只>代码> char */COD>,因此您可以从任何代码中选择任何有效的内存地址,即使是从<代码>向量<代码>。我需要使用C和C++容器对缓冲区OPS进行比较。我已经使用C++容器实现了工作版本,另一个应该限于C,主要是MimCPY、MeMeMype、STRCPY和STRCAT函数。不知何故,第二个缓冲区对我来说并不那么容易。问题是,当代码在jpg文件中读取时,它最终在响应的内容部分被截断。基本上,它有两个缓冲区,一个文本缓冲区和bin缓冲区。不知何故,我无法将这两个缓冲区合并到WSABUF.bufn中,这并不奇怪,因为您将二进制缓冲区视为以null结尾的字符串,而事实并非如此。想想当buffer2
包含二进制空字节时,strlen(buffer2)将返回什么。您最终会向调用者返回一个截断的len
值。至少,您需要将n=strlen(buffer2)
更改为n=strlen(buffer)
,并将*len=strlen(buffer2)
更改为*len=bufsiz
。我添加了代码,它们正在工作,这将用于与第一个代码进行比较。这是另一个同样有效的代码。这是,这段代码的周转时间平均为20毫秒。我得到的最快速度是<1毫秒。除了矢量字节之外,大部分都是基于C的。
void HttpResponse::GetResponse2(std::vector<byte> *pv)
{
pv->clear();
std::ostringstream oss;
oss << resp_ok << "\n"
oss << "Date: " << "May 10, 2015" << "\n";
oss << "Content-Type: " << contenType << "\n";
oss << "Content-Length: " << m_sbResponse.size() << "\n";
oss << "\n";
std::string s = oss.str();
pv->reserve(s.length() + m_sbResponse.size());
std::copy(s.begin(), s.end(), std::back_inserter(*pv));
std::copy(m_sbResponse.begin(), m_sbResponse.end(), std::back_inserter(*pv));
}