2011-04-12 15 views
1

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"を持ちます。 ...何が起こっている?

+0

のVisual Studioを'2011'?え? – Marlon

+0

@Marlon Lol、oops。一定。ありがとう。 – leetNightshade

+5

libcurlを使用すると、ホイールとサポートを再実装する必要がなくなります。チャンクエンコード。 – Erik

答えて

6

いわゆる「ガベージ」は、実際にはサーバーからのチャンクされたデータです。 HTTP/1.1仕様は、チャンク形式でデータを返信することが自由であり、HTTP/1.1仕様はかなり明確です。「すべてのHTTP/1.1アプリケーションは、「チャンク」転送コードを受信して​​デコードできる必要があります(MUST) 。チャンクエンコーディングの

詳細はHTTP/1.1仕様で説明されています

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1

あなたはHTTPクライアントを作成する場合は、あなたがHTTPの仕様を読む必要が...

+1

私はHTTPクライアントを書くつもりはない、私はちょうどカンマ区切りで\ n分割テキスト形式でHTTPサーバからデータを取得しようとしているので、クライアントプログラムは登録されたサーバをリストから選んで接続することができるに。そして、ありがとう、私は仕様を読むでしょう。 – leetNightshade

+2

私はHTTPサーバからデータを受け取るプログラムを指していると思いますので、あなたの数は私が恐れることになります。 (おそらく、あなたはチャンクエンコーディングを使ってデータを送信しないようにサーバーを設定できますが、それは疑いの余地があります。仕様ではすべてのクライアントがサポートしていると仮定できるので、何がポイントなのでしょうか?私は非常にシンプルなHTTPサーバーを作成しました。そのためにも、HTTP仕様は、私が予想していたよりも厄介なものでした。 –

関連する問題