1

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

4

2 に答える 2

3

C および C++ では、文字列は値がゼロの文字 ( '\0') で終了します。したがって、「バイナリ文字列」と言うとき、バイナリデータは文字列と同じではないため、一緒にならないものが混在しています。

文字列の代わりにBYTE配列を使用し、追加の引数として長さを渡して、送信するバイト数がわかるようにします。

の使用はstrlen()、文字列ターミネータに遭遇するとすぐにカウントを停止します。

于 2013-01-03T00:15:14.397 に答える
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を使用する)。ただし、何らかのエンコーディングを使用して、Webサーバーからバイナリデータを送信することをお勧めします。read()getline()

于 2013-01-03T01:51:58.607 に答える