Visual Studio 2010を使用してWinsock 2.2を使用してC++でネットワークゲームを作成しています。ゲーム用のアクティブなサーバのリストを格納するためのWebサーバ。サーバーが起動すると、終了時に自分のWebサーバーに登録されます。サーバのリストに誰かがアクセスしたときにサーバ自体がリストをクリーンアップしようとします(この動作はまだサーバ上で作業しすぎないように設計していますが、ゲームサーバが自分自身を追加しようとしたときphpファイルはfsockopenを使用して、実際に外部ネットワークからサーバにアクセスできるかどうかを検出します。そうでなければ、ポート転送を適切に設定するか、何らかの方法で問題を解決するまでサーバが追加されません。TCP接続を使用してHTTPサーバーからデータを取得することはまれではありますが、ゴミデータがあります
いくつかの調査の後、私は、HTTP接続サーバー用の特殊なメッセージをフォーマットするTCP接続を使用してサーバーから何かを取得する方法を考え出しました。私が持っているものは次のとおりです。
if(FAIL == Connection::Get_Connection(&m_Connection, networkSettings.ServerListAddress, 80))
{
return FAIL;
}
m_Connection.SendMsg("GET /servers.php HTTP/1.1\r\nHost: cyclotron.leetnightshade.com\r\nUser-Agent: CycloTron\r\n\r\n");
正しくフォーマットされていないデータが戻ってくることを期待しています。ここで
2f
Server Count:1
129.21.138.1,40000,Depth of Hell
0
は、すべてのヘッダー情報を持ついくつかのゴミの別の出力です:ここで私が得ているものだ
HTTP/1.1 200 OK
Date: Tue, 12 Apr 2011 23:23:11 GMT
Server: Apache
X-Powered-By: PHP/5.2.17
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=8254688ee345202bd177d57e4ba339b2; path=/
Set-Cookie: PHPSESSID=73eae89f61e7268f433af9bdfe299173; path=/
Set-Cookie: PHPSESSID=8fb5d6fd9f1023bb00290b4daa3c7952; path=/
Connection: close
Transfer-Encoding: chunked
Content-Type: text; charset=us-ascii
e
Server Count:1
21
129.21.138.1,40000,Depth of Hell
0
は、これは私の出力が見えるようになっているものである、と私は上にこれを得るのですか機会はなく、すべての時間:
HTTP/1.1 200 OK
Date: Tue, 12 Apr 2011 23:32:13 GMT
Server: Apache
X-Powered-By: PHP/5.2.17
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=a3c88c2d96d45c6f6d3b029e095c429a; path=/
Set-Cookie: PHPSESSID=bf19734ff60813d6d0a5ba944410356a; path=/
Set-Cookie: PHPSESSID=c36a2d9e12c81d4a19a7f41dc5522b4e; path=/
Content-Length: 47
Connection: close
Content-Type: text; charset=us-ascii
Server Count:1
129.21.138.1,40000,Depth of Hell
私は、これはあまり重要とは思わないが、これは、Webサーバー上の私のPHPコードです:
$num = mysql_num_rows($result);
echo 'Server Count:'.$num;
while ($row = mysql_fetch_assoc($result))
{
// TODO: check date of entry, if it's really old, remove it.
echo PHP_EOL.$row['address'].','.$row['port'].','.$row['displayName'];
}
ここでは、文字列を受け取るコードの一部です(はい、現時点では少し骨がありますが、2つの新しい行を探すためにcstring関数を使用できることはわかっています文字列のコピーを、私は)物事を簡単にするために文字列を使用してに固執しようとしている:だから
memset(m_MsgBuffer, 0, sizeof (char) * M_BufferSize);
m_Received = recv(m_Connection.M_Socket, m_MsgBuffer, M_BufferSize, 0);
m_MsgBuffer[m_Received] = '\0';
string str = string(m_MsgBuffer);
size_t index = str.find("\r\n\r\n");
str.erase(0,index);
std::cout << "Received message: " << str << std::endl;
、あなたのいずれかがこのゴミデータから来ているアイデアを持っていますか?
EDIT:正しいヘッダー情報を確認した後、ガベージを持つものは "Transfer-Encoding:chunked"を持ち、do notは "content-length"を持ちます。 ...何が起こっている?
のVisual Studioを'2011'?え? – Marlon
@Marlon Lol、oops。一定。ありがとう。 – leetNightshade
libcurlを使用すると、ホイールとサポートを再実装する必要がなくなります。チャンクエンコード。 – Erik