Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用TCP连接从HTTP服务器获取数据,这种情况很少出现';垃圾数据 我用WiSOCKS 2.2编写C++网络游戏,使用VisualStudio 2010,并决定用我的Web服务器存储游戏的活动服务器列表是个好主意。当服务器启动时,它将在退出时向我的web服务器注册自己;当有人访问服务器列表时,服务器本身将尝试清理该列表(这种行为我仍在努力设计,以避免在服务器上做太多工作;但我认为,当游戏服务器尝试添加自身时,我的php文件将使用fsockopen来检测它是否能够从外部网络访问服务器,如果不能,服务器将不会被添加,直到它能够正确设置端口转发或以某种方式解决此问题e问题)_C++_Tcp_Http Headers_Winsock2_Winsockets - Fatal编程技术网

使用TCP连接从HTTP服务器获取数据,这种情况很少出现';垃圾数据 我用WiSOCKS 2.2编写C++网络游戏,使用VisualStudio 2010,并决定用我的Web服务器存储游戏的活动服务器列表是个好主意。当服务器启动时,它将在退出时向我的web服务器注册自己;当有人访问服务器列表时,服务器本身将尝试清理该列表(这种行为我仍在努力设计,以避免在服务器上做太多工作;但我认为,当游戏服务器尝试添加自身时,我的php文件将使用fsockopen来检测它是否能够从外部网络访问服务器,如果不能,服务器将不会被添加,直到它能够正确设置端口转发或以某种方式解决此问题e问题)

使用TCP连接从HTTP服务器获取数据,这种情况很少出现';垃圾数据 我用WiSOCKS 2.2编写C++网络游戏,使用VisualStudio 2010,并决定用我的Web服务器存储游戏的活动服务器列表是个好主意。当服务器启动时,它将在退出时向我的web服务器注册自己;当有人访问服务器列表时,服务器本身将尝试清理该列表(这种行为我仍在努力设计,以避免在服务器上做太多工作;但我认为,当游戏服务器尝试添加自身时,我的php文件将使用fsockopen来检测它是否能够从外部网络访问服务器,如果不能,服务器将不会被添加,直到它能够正确设置端口转发或以某种方式解决此问题e问题),c++,tcp,http-headers,winsock2,winsockets,C++,Tcp,Http Headers,Winsock2,Winsockets,好的,在做了一些研究之后,我找到了如何通过格式化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.leetnigh

好的,在做了一些研究之后,我找到了如何通过格式化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';
字符串str=字符串(m_MsgBuffer);
size\u t index=str.find(“\r\n\r\n”);
str.erase(0,索引);
std::cout所谓的“垃圾”实际上是来自服务器的分块数据。HTTP/1.1服务器可以自由地以分块格式发送数据(如果愿意),HTTP/1.1规范非常明确:“所有HTTP/1.1应用程序必须能够接收和解码“分块”传输编码”

HTTP/1.1规范中描述了分块编码的详细信息:

如果您正在编写HTTP客户端,您需要阅读HTTP规范。

所谓的“垃圾”实际上是来自服务器的分块数据。HTTP/1.1服务器可以自由地以分块格式发送数据,如果它愿意的话,HTTP/1.1规范非常清楚:“所有HTTP/1.1应用程序都必须能够接收和解码”分块数据“传输编码”

HTTP/1.1规范中描述了分块编码的详细信息:


如果您正在编写HTTP客户端,您需要阅读HTTP规范。

@Marlon Lol,oops.已修复。谢谢。使用libcurl-无需重新实现控制盘并支持例如分块编码。分而治之。1.通过telnet主机80测试服务器并键入GET呼叫。2.使用www.google尝试您的客户端。com@Tom是的,我很沮丧在比较标题信息之前,我用它发布了我的问题。所以我意识到这与“传输编码:分块”有关",我只是想知道我是否可以禁用服务器上的编码,这样我的客户端就不必担心了。使用libcurl或类似的@Erik said@Marlon Lol,oops.Fixed。谢谢。使用libcurl-省去了重新实现轮子和支持例如分块编码。分而治之的麻烦。1.通过telnet主机80测试服务器并键入GET c全部。2.使用www.google试试你的客户。com@Tom是的,我对它感到很沮丧,在比较标题信息之前发布了我的问题。所以我意识到这与“传输编码:分块”有关,我只是想知道我是否可以禁用服务器上的编码,这样我的客户端就不必担心了。使用libcurl或类似的@Erik所说的方法。我并不是说要编写一个HTTP客户端,我只是试图从HTTP服务器上以逗号分隔和拆分文本格式获取数据,这样客户端程序就可以从e列表连接。谢谢,我将阅读规范。我相信规范指的是任何从HTTP服务器接收数据的程序,所以我担心您的程序会被计算在内。(也许您可以将服务器配置为不使用分块编码发送数据——但我对此表示怀疑,因为规范说服务器可以假设所有客户端都支持它,那么这有什么意义呢?)不管怎样,祝你好运;我已经编写了一个非常简单的HTTP服务器,即使是这样,HTTP规范也比我预想的要烦人得多。我并不是说要编写HTTP客户端,我只是尝试以逗号分隔和拆分文本格式从HTTP服务器获取数据,这样客户端程序就可以从列表中选择一个已注册的服务器来连接to、 谢谢,我将阅读规范。我相信规范指的是任何从HTTP服务器接收数据的程序,所以我恐怕你的程序也算数。(也许您可以将服务器配置为不使用分块编码发送数据——但我对此表示怀疑,因为规范中说服务器可以假定所有客户端都支持它,那么这有什么意义呢?)祝您好运;我已经编写了一个非常简单的HTTP服务器,即使如此,HTTP规范也比我预期的要烦人得多。
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;