2 caoczy caoczy 于 2016.02.19 15:39 提问

c 模拟http请求,如何获取页面中的图片?

1.我编写了一个SOCKET程序,功能类似代理软件,主要是将指定服务器的页面转发到本地。
2.在浏览器访问本地地址时,就会打开指定服务器的页面
3.现在的问题是可以获取到文本数据,如:

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />•
<html>
<head>
</head>
<body>
<h1>This a test</h1>

<p>
<img src="test.png" width="512" height="512" />                                                                                    
</p>
</body>
</html>

浏览器也可以显示页面,但是图片无法加载
4.请问是什么原因呢?是否是http服务器关闭了这次连接,但是图片却并没有拿到本地导致的?
5.有什么解决办法吗?


程序已经找到问题了。原来的程序在文本信息发送后,确实会将图片等其他数据传过来。
但是还是找不到什么原因导致的图片传输一半就会关闭连接。
1.目前我的代理程序在windows端工作,使用完成端口,想将远程服务器的页面转发到本地,然后在浏览器可以打开页面。
2.目前的问题是图片会偶尔传输不过来,尺寸小的图片可以传送,但是大尺寸的图片传输一部分后,连接就会关闭.
3.同样的连接模式,在linux平台使用epoll模型,转发数据都正常。
请问可能是哪方面问题呢?

/*
+----------------------------------------------------------------------------------------------+
|           在本地PC运行的程序分为服务端与客户端                                    |
|                                                                                              |
|   +--------------------------+             +---------------------------------------+         |            +---------------------------+
|   |                          |             |                                       |         |            |                           |
|   |    本地客户端              |             |    在本地建立的服务端                   |         |            |   192.168.2.19            |
|   |    主要是浏览器            +-----------> |    负责将本地数据转发到远端服务器        +------------------->  |   远端服务器               |
|   |    FTP等软件            |             |    或者将远端服务器发送过来             |         |            |    真实的目标地址           |
|   |                          |             |    的数据转发到本地的客户端             |         |            |                           |
|   |                          |  <----------+                                       |  <-------------------+                           |
|   |                          |             |                                       |         |            |                           |
|   +--------------------------+             +---------------------------------------+         |            |                           |
|                                                                                              |            +---------------------------+
|                                                                                              |
+----------------------------------------------------------------------------------------------+

要达到效果是:
在浏览器中输入 127.0.0.1:8000
打开192.168.2.19的主页面


2个回答

oyljerry
oyljerry   Ds   Rxr 2016.02.19 17:05

图片返回的是不是一个路径,这里图片只有名字,你需要拿到它实际的地址等。页面中返回没有。

caoczy
caoczy 这个图片的路径,正常使用浏览器访问不也是返回一个相对路径吗?
接近 2 年之前 回复
zuishikonghuan
zuishikonghuan   2016.02.19 19:32

应该是代理服务器代码的问题,如果长连接开启,一次http可以传输多个包,如果长连接关闭,那么浏览器加载html后会重新发起一个http请求索取图片

zuishikonghuan
zuishikonghuan 因为开启了长连接,这是HTTP/1.1的标准。如果服务器要求浏览器不开启长连接,就会再次socket连接。开启长连接后一次socket要传好几次http包
接近 2 年之前 回复
caoczy
caoczy 就是说浏览器在加载html以后,还是会发起一次socket连接是吗?但是我的测试程序在加载html后就关闭socket连接了,然后也不会再次发起连接
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!