2013-01-03 54 views
1

我想與函數發送binary datasend()轉換 「二進制串」 到 「爲const char *」 的發送(Web服務器)

功能:

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

回答

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服務器發送二進制數據。

+0

謝謝,工作:)爲你+1 –

3

在C和C++中,字符串以值爲零的字符結尾('\0')。所以當你說「二進制字符串」時,由於二進制數據與字符串不一樣,所以混合的東西不能放在一起。

代替字符串,使用​​數組並將長度作爲附加參數傳遞,以便知道要發送多少個字節。

您使用strlen()會在遇到字符串終止符時立即停止計數。

+0

std :: string可以保存二進制數據,所以如果OP不轉換爲C字符串,他可以使這項工作...(或向量) –

+0

是的,我不是故意暗示它不能夠'不能工作,但我不認爲它是理想的。除了null結束符問題之外,還有Unicode的問題。所以,我不知道他的'send()'方法做了什麼,但我認爲它應該發送字節。 –

+0

我認爲他的send()是套接字API。 –