几天来我一直在尝试将整个PNG读入一个字符串,所以我可以通过winsock2将它上传到服务器,它似乎在几个字符或某种换行符后停止读取文件,是否有任何特殊原因以及解决它的方法。
我已经尝试了很多解决方案,现在这开始让我发疯了。我正在使用的当前代码如下
std::ifstream in ("some.png", ios::in|ios::binary|ios::ate );
std::string contents;
if (in)
{
in.seekg(0, in.end);
contents.resize(in.tellg());
in.seekg(0, in.beg);
in.read(&contents[0], contents.size());
in.close();
length = contents.size();
}
我不知道问题可能是什么,因为我对 c++ 比较陌生,所以我已经在谷歌上拖了几天,但没有任何可行的解决方案。
请帮忙
UPDATE 代码发布到服务器
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
return;
SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0)
throw;
SOCKADDR_IN service;
service.sin_family = AF_INET;
service.sin_port = htons(80);
LPHOSTENT host = gethostbyname("127.0.0.1");
if (!host)
throw;
service.sin_addr = *((LPIN_ADDR)*host->h_addr_list);
if (connect(fd, (SOCKADDR *)&service, sizeof(service)) < 0)
throw;
int length ;
std::ifstream in (CCFileUtils::fullPathFromRelativePath("back.png"), ios::in|ios::binary|ios::ate );
std::string contents;
if (in){
in.seekg(0, in.end);
contents.resize(in.tellg());
in.seekg(0, in.beg);
in.read(&contents[0], contents.size());
in.close();
length = contents.size();
}else
std::string str =
"POST /index.php HTTP/1.1\r\n"
"Host: metapps.co.uk\r\n"
"Accept: */*\r\n";
char buffer1 [50];
str.append( "Content-Length: 121\r\n" );
str.append( "\r\n" );
str.append( "Content-Disposition: form-data; name=\"tmp\";filename=\"photo.png\"\r\n" );
str.append( "Content-Type: image/dds\r\n" );
sprintf (buffer1, "Content-Length: %d\r\n", length);
str.append( buffer1 );
str.append( contents );
str.append( "\r\n\x01A\r\n" );
// send str ...
send(fd, str.c_str() , strlen( str.c_str() ) +1 , 0);
char ret[1024];
recv(fd,ret,strlen(ret),0);
closesocket(fd);
WSACleanup();
}
更新 2
它与 Null 终止符字符串和 append 方法有关
如果我做
str.append( "he\0llo" );
服务器只会显示“他”
如果我做
str.append( "hello" );
我打个招呼,希望这些信息能带来解决方案