将“二进​​制字符串”转换为“const char *”以进行发送(Web服务器)

时间:2013-01-03 00:08:16

标签: c++ http binary

我希望发送binary data函数send()

功能

void ssend(const char* data){
    send(socket_fd, data, strlen(data), 0);
}

bool readFile(const char* path){
    std::ifstream ifile(path);
    if(ifile){
        if(!ifile.is_open()){
            ErrorPage("403");
            return true;
        }
        std::string sLine;

        std::string Header = "HTTP/1.1 200 OK\nConnection: Keep-Alive\nKeep-Alive: timeout=5, max=100\nServer: BrcontainerSimpleServer/0.0.1 (Win32) (Whitout Compiler code)\n\n";
        ssend(Header.c_str());

        while(!ifile.eof()){
            getline(ifile, sLine);
            cout << "String: " << sLine << endl;
            cout << "const char*: " << sLine.c_str() << endl;

            ssend(sLine.c_str());
        }
        return true;
    }
    return false;
}

测试

...
while (1) {
    socket_fd = accept(listen_fd, (struct sockaddr *)&client_addr,&client_addr_length);
    readFile( httpPath );
    recv(socket_fd, request, 32768, 0);
    closesocket(socket_fd);
}
...

使用binary string转换为.c_str()时,数据会消失。如何解决这个问题?

如何使用函数binary data发送send()

2 个答案:

答案 0 :(得分:3)

在C和C ++中,字符串以值为零('\0')的字符终止。因此,当你说“二进制字符串”时,你混合的东西不能放在一起,因为二进制数据与字符串不同。

使用BYTE数组代替字符串,并将长度作为附加参数传递,以便知道要发送多少字节。

strlen()的使用将在遇到字符串终结符后立即停止计数。

答案 1 :(得分:1)

你可以:

void ssend(const std::string& data)
{
  send(socket_fd, data.data(), data.length(), 0);
}

或:

ssend(const std::vector<char>& data)
{
  send(socket_fd, &data[0], data.size(), 0);
}

如果您正在从文件中读取二进制数据,则还需要处理该文件(例如,使用ios::binary打开文件,请使用read()而不是getline())。您可能希望使用某种编码来从Web服务器发送二进制数据。

相关问题