使用TCP连接从HTTP服务器获取数据时,在极少数情况下会出现垃圾数据

|| 我正在使用Winsocks 2.2,Visual Studio 2010和C ++编写网络游戏,并决定使用Web服务器存储该游戏的活动服务器列表是一个好主意。服务器启动时,它将在退出注销时向我的Web服务器注册自己。并且当有人访问服务器列表时,服务器本身将尝试清除列表(此行为我仍在设计中,以不涉及服务器上过多的工作;但是我认为游戏服务器尝试添加自身时,我的php文件将使用fsockopen来检测它是否实际上可以从外部网络访问服务器,如果不能,则不会添加服务器,直到可以正确设置端口转发或以某种方式解决该问题为止)。 好的,因此,在进行了一些研究之后,我想出了如何通过为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\'];
}
这是涉及接收字符串的一些代码(是的,此刻还有些空洞,我意识到我可以使用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;
那么,您有没有一个想法,这些垃圾数据来自何处? 编辑:在查看了正确的标头信息之后,带有垃圾的那个具有\“ Transfer-Encoding:chunked \”并且没有\\“ content-length。\” ...这是怎么回事?     
已邀请:
所谓的“垃圾”实际上是来自服务器的分块数据。如果愿意,HTTP / 1.1服务器可以自由地以块格式发送回数据,并且HTTP / 1.1规范非常明确:\“所有HTTP / 1.1应用程序必须能够接收和解码\”分块\“传输-编码\”。 HTTP / 1.1规范中描述了分块编码的详细信息: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1 如果您正在编写HTTP客户端,则需要阅读HTTP规范。     

要回复问题请先登录注册