socket请求HTTP,为什么只能发送一次GET请求?

时间:2021-04-10 04:30:27
第一次请求,返回来的成功。第二次发送就不行了。怎么回事?

	for(int i = 0; i < 10000; i++)
{
char http[] = "GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection:Keep-Aliv\r\n\r\n";
int sendSize = send(sConn, http, strlen(http) + 1, 0);
if(sendSize == -1)
{
continue;
}
printf("send:%d\n", sendSize);

while(TRUE)
{
char buffer[1024];
memset(buffer, 0, 1024);
int retSize = recv(sConn, buffer, 1024, 0);
printf("recv:%s\n", buffer);
if( retSize<=0 )
{
break;
}
}
system("pause");
}

27 个解决方案

#1


GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection: Keep-Aliv\r\n\r\n

#2


引用 1 楼 mayudong1 的回复:
GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection:Keep-Aliv\r\n\r\n


请兄弟指点,红色字是持久连接?

#3


我的意思是你不觉得你写错了吗

#4


我想连续请求N次,Connection改为close,也是只能请求一次?

#5


第一次能请求啊。recv回来HTML。第FOR第二三之后,发送能发送出去,接收就没有了

#6


Connection:Keep-Aliv e

没有试过,不知道拼写错了有没有什么影响

#7


网上复制的,人家也是这样写的?错了吗?

#8


http://www.vckbase.com/document/viewdoc/?id=1208

#9


Connection:Keep-Alive
Connection:Keep-Aliv

拼写错误一定会有影响的

Keep-Alive决定了能否复用连接进行下一次get

#10


引用 9 楼 fantiyu 的回复:
Connection:Keep-Alive
Connection:Keep-Aliv

拼写错误一定会有影响的

Keep-Alive决定了能否复用连接进行下一次get


Connection:Keep-Aliv

现在改成这样写也不行,只能GET第一次...

#11


难到每一次连接都需要“建立连接”、“发送请求”这样子?

#12


send:127
recv:HTTP/1.1 200 OK
Date: Fri, 21 Jan 2011 13:24:49 GMT
Server: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.5
X-Powered-By: PHP/5.3.5
Content-Length: 455
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

第一次连接,返回这些东西。状态正常,第二次为什么就不可以呢?

#13


如果是服务器主动把这个连接关掉了,就设置Keep-Alive

#14


建议使用curl库

#15


HTTP协议基本就是这样子的

#16


用IE试试,如果可以重用连接,抓IE的包分析。
第二次请求模拟IE的Http格式发。

#17


所以说http 是无状态的

#18


引用 1 楼 mayudong1 的回复:
GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection:Keep-Aliv\r\n\r\n

好眼力。

#19


引用 5 楼 morequestion 的回复:
第一次能请求啊。recv回来HTML。第FOR第二三之后,发送能发送出去,接收就没有了


是没有返回, 还是返回没有数据?

连续请求同一页面,  不会返回数据的,与服务器设置有关 IE也是这样

#20


对于TCP连接,特别是http不支持多次连续连接,当服务器段发送完数据之后会把握手断开,这也是解决服务器负荷的一种措施,避免长时间连接导致服务器端资源的长时间浪费

#21


感觉第二次send的时候,应该会返回失败吧。 

http服务,一般在发送完应答数据包后,会主动关闭连接。 
可以重复 "请求,读应答,关闭连接"

#22


http协议标准为一次请求一次连接
Keep-Alive 通常最多维持300秒,1.1版本支持,但是服务器不一定支持,服务器想什么时候close,与客户端想什么时候close一样,是各自的*

因此
1、简单安全的做法就是,一次请求,一次连接,不管服务器态度如何, 办完事,穿衣服走人:)
2、维持连接,编程就有点复杂了,需要监听套节字事件(通常FD_READ|FD_WRITE|FD_CLOSE),根据事件响应,确定后续行动...

#23


引用 22 楼 ok1234567 的回复:
http协议标准为一次请求一次连接
Keep-Alive 通常最多维持300秒,1.1版本支持,但是服务器不一定支持,服务器想什么时候close,与客户端想什么时候close一样,是各自的*

因此
1、简单安全的做法就是,一次请求,一次连接,不管服务器态度如何,办完事,穿衣服走人:)
2、维持连接,编程就有点复杂了,需要监听套节字事件(通常FD_READ|FD_WRITE|FD_CL……

 对,我之前也是这种情况的,后来才知道
HTTP请求完一次后socket就close();,下次请求时再创建一次(不是连接,close()后SOCKET好像已经销毁了吧)

#24


该回复于2011-02-26 09:14:01被版主删除

#25


之前好象也碰到过这个问题,
友情帮顶。。。

#26


如果每次发包都要连接一次的话,
有的服务器检测到频繁连接服务器,就会拒绝连接。。。

#27


初学学习下

#1


GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection: Keep-Aliv\r\n\r\n

#2


引用 1 楼 mayudong1 的回复:
GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection:Keep-Aliv\r\n\r\n


请兄弟指点,红色字是持久连接?

#3


我的意思是你不觉得你写错了吗

#4


我想连续请求N次,Connection改为close,也是只能请求一次?

#5


第一次能请求啊。recv回来HTML。第FOR第二三之后,发送能发送出去,接收就没有了

#6


Connection:Keep-Aliv e

没有试过,不知道拼写错了有没有什么影响

#7


网上复制的,人家也是这样写的?错了吗?

#8


http://www.vckbase.com/document/viewdoc/?id=1208

#9


Connection:Keep-Alive
Connection:Keep-Aliv

拼写错误一定会有影响的

Keep-Alive决定了能否复用连接进行下一次get

#10


引用 9 楼 fantiyu 的回复:
Connection:Keep-Alive
Connection:Keep-Aliv

拼写错误一定会有影响的

Keep-Alive决定了能否复用连接进行下一次get


Connection:Keep-Aliv

现在改成这样写也不行,只能GET第一次...

#11


难到每一次连接都需要“建立连接”、“发送请求”这样子?

#12


send:127
recv:HTTP/1.1 200 OK
Date: Fri, 21 Jan 2011 13:24:49 GMT
Server: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.5
X-Powered-By: PHP/5.3.5
Content-Length: 455
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

第一次连接,返回这些东西。状态正常,第二次为什么就不可以呢?

#13


如果是服务器主动把这个连接关掉了,就设置Keep-Alive

#14


建议使用curl库

#15


HTTP协议基本就是这样子的

#16


用IE试试,如果可以重用连接,抓IE的包分析。
第二次请求模拟IE的Http格式发。

#17


所以说http 是无状态的

#18


引用 1 楼 mayudong1 的回复:
GET / HTTP/1.1\r\nHost:www.baidu.com\r\nAccept:*/*\r\nUser-Agent:MSIE 8.0\r\nConnection:Keep-Aliv\r\n\r\n

好眼力。

#19


引用 5 楼 morequestion 的回复:
第一次能请求啊。recv回来HTML。第FOR第二三之后,发送能发送出去,接收就没有了


是没有返回, 还是返回没有数据?

连续请求同一页面,  不会返回数据的,与服务器设置有关 IE也是这样

#20


对于TCP连接,特别是http不支持多次连续连接,当服务器段发送完数据之后会把握手断开,这也是解决服务器负荷的一种措施,避免长时间连接导致服务器端资源的长时间浪费

#21


感觉第二次send的时候,应该会返回失败吧。 

http服务,一般在发送完应答数据包后,会主动关闭连接。 
可以重复 "请求,读应答,关闭连接"

#22


http协议标准为一次请求一次连接
Keep-Alive 通常最多维持300秒,1.1版本支持,但是服务器不一定支持,服务器想什么时候close,与客户端想什么时候close一样,是各自的*

因此
1、简单安全的做法就是,一次请求,一次连接,不管服务器态度如何, 办完事,穿衣服走人:)
2、维持连接,编程就有点复杂了,需要监听套节字事件(通常FD_READ|FD_WRITE|FD_CLOSE),根据事件响应,确定后续行动...

#23


引用 22 楼 ok1234567 的回复:
http协议标准为一次请求一次连接
Keep-Alive 通常最多维持300秒,1.1版本支持,但是服务器不一定支持,服务器想什么时候close,与客户端想什么时候close一样,是各自的*

因此
1、简单安全的做法就是,一次请求,一次连接,不管服务器态度如何,办完事,穿衣服走人:)
2、维持连接,编程就有点复杂了,需要监听套节字事件(通常FD_READ|FD_WRITE|FD_CL……

 对,我之前也是这种情况的,后来才知道
HTTP请求完一次后socket就close();,下次请求时再创建一次(不是连接,close()后SOCKET好像已经销毁了吧)

#24


该回复于2011-02-26 09:14:01被版主删除

#25


之前好象也碰到过这个问题,
友情帮顶。。。

#26


如果每次发包都要连接一次的话,
有的服务器检测到频繁连接服务器,就会拒绝连接。。。

#27


初学学习下