나는 서버를 boost.asio 및 PHP 클라이언트로 C++로 작성했습니다. 내가 소량의 데이터를 보내면 모든 데이터를 얻을 수 있지만 긴 문자열을 보내면 대부분 느슨해집니다. 여기 보내고받은 데이터의 크기가 같지 않음
내가 내 서버에서 데이터를 전송하는 부분입니다, 내가 65536 바이트 여기void handle_write(const boost::system::error_code& /*error*/,
size_t size/*bytes_transferred*/) {
cout <<size<<endl;
}
void handler_read(const boost::system::error_code&, std::size_t size) {
istream is(&buffer);
string myString;
getline(is, myString);
Manager myManager(myString);
string response = myManager.getResponse();
boost::asio::async_write(socket_,
boost::asio::buffer(response),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
내가 PHP는 측면에서
string getMap(string name, string pass) {
if (name == "admin" && pass == "123") {
string response = "";
ConvertTypes types;
response = types.intToString(MAP_HEIGHT) + " ";
response += types.intToString(MAP_WIDTH) + "\r\n";
for (int i=0; i<MAP_HEIGHT;i++) {
for (int j=0;j<MAP_WIDTH;j++) {
response += types.intToString(
worldMap[i][j].getHeight()) + " ";
response += types.intToString(
worldMap[i][j].getIsTown()) + " ";
response += string (1, worldMap[i][j].getTetrain())
+"\r\n";
}
}
return response;
} else {
return "";
}
}
를 전송 될 문자열을
을 보낸 말한다 나는 보낸 데이터를 읽었고, stream_get_meta_data는 단지 8183 바이트의 데이터 만 받았습니다.print_r($this->socket->getStatus());
for ($i=0; $i<$MAP_HEIGHT;$i++) {
for ($j=0; $j<$MAP_WIDTH;$j++) {
$this->response = $this->socket->readLine();
$this->response = explode(' ', $this->response);
echo "<p>";
echo "$i $j <br>";
print_r($this->response);
echo '<br>';
print_r($keyArray);
$map[$i][$j] = array_combine($keyArray, $this->response);
$this->response = $this->socket->readLine();
} }
}
PHP를 모르지만 네트워크 패킷이 모두 한 블록으로 전달된다는 보장이 없습니다. 잠깐 기다렸다가 다시 읽으려고하면 더 많은 정보가 있습니까? – forsvarir