我想做的基本上是通过套接字捕获浏览器的 HTTP GET 请求并将该请求发送到 Internet,然后捕获回复并将其发送回浏览器。当传输仅包含文本时,一切都完美无缺。但是在下载图片的时候。浏览器给出错误“无法显示图像,因为它包含错误”。任何帮助将不胜感激。
#include "cc352.h"
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char **argv)
{
int listenfd, connfd,weblin,webcon,webwrite,n,x,y,w,w1;
socklen_t len,wlen;
struct sockaddr_in servaddr, cliaddr , webservad , webcliad;
unsigned char buff[3072] , buff2[3072] ,ext[5] ,wbuff[100000];
time_t ticks;
int yes = 1;
const char *ptr;
if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
fprintf(stderr, "socket creation failed\n");
exit (1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
if (inet_pton(AF_INET,"127.0.0.1", &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s", argv[1]);
return 1;
}
servaddr.sin_port = htons(4619);
if ( (bind(listenfd, (SA *) &servaddr, sizeof(servaddr))) < 0) {
fprintf(stderr, "bind failed\n");
exit (1);
fprintf(stdout, "bindd completed\n");
}
if ( (weblin = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
fprintf(stderr, "socket creation failed\n");
exit (1);
}
printf("weblin socket created \n");
bzero(&webservad, sizeof(webservad));
webservad.sin_family = AF_INET;
webservad.sin_port = htons(80);
if (inet_pton(AF_INET,"208.80.152.211", &webservad.sin_addr) <= 0){
printf("inet_pton error for %s", argv[1]);
return 1;
}
if (connect(weblin, (SA *) &webservad, sizeof(webservad)) < 0) {
printf("weblin connect error");
return 1;
}
printf("weblin connected \n");
if ( listen(listenfd, LISTENQ) < 0) {
fprintf(stderr, "listen failed\n");
exit (1);
fprintf(stderr, "listning\n");
}
len = sizeof(cliaddr);
if ( (connfd = accept(listenfd, (SA *) &cliaddr, &len)) < 0 ) {
fprintf(stderr, "accept failed\n");
exit (1);
}
fprintf(stdout, "Connection accepted\n");
int d=0;
read(connfd,&buff, 3071); // Reads GET request from browser save it to array buff
unsigned char bron[strlen(buff)];
for(d=0 ; d<=sizeof(bron) ; d++){
bron[d]=buff[d];
}
write(weblin,bron, sizeof(bron)); // Send the data to Internet
printf("%s \n",bron);
while(d=read(weblin,&wbuff, 100000)>0){ //Reads the reply from Internet and save it to wbuff
unsigned char wron[strlen(wbuff)];
for(d=0 ; d<=sizeof(wron) ; d++ ){
wron[d]=wbuff[d];
}
write(connfd,wbuff,strlen(wbuff)); //Writes the reply to the browser
printf("%s \n",wron);
}
close(connfd);
close(listenfd);
close(weblin);
}
最佳答案
strlen
适用于以 0
结尾的 C 字符串。 0
在二进制图像文件中完全有效。所以你可能没有发送尽可能多的数据。 (或者甚至比你得到的数据更多,甚至可能比你的缓冲区应该容纳的更多,如果图像恰好不包含0
.)
如果您不检查read
调用是否成功,则永远不要对传递给read
的缓冲区做任何事情。您需要使用read
的返回值,因为这是告诉您获得了多少数据的唯一信息。
您假设您将在单个 read
调用中读取整个请求。没有什么能保证这一点。
(我不明白你想用 wron
做什么,而 bron
在你的代码中是不必要的。还有一个 memcpy
函数。使用它而不是滚动你自己的。)
(并且您应该检查所有 write
调用的返回码。)
关于c - Web 浏览器不解释通过无符号字符数组传递的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7380515/