Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为文本和Bin缓冲区设置WSABUF.buf?_C++_Http_Winsock_Memcpy - Fatal编程技术网

C++ 如何为文本和Bin缓冲区设置WSABUF.buf?

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();

我正在重构代码,以避免使用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();
    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));
}