基本的なことは、ソケット経由でブラウザのHTTP GET要求をキャプチャし、その要求をインターネットに送信し、それをブラウザに戻します。転送がテキストのみで構成されている場合、すべてのものが完全に機能します。しかし、イメージをダウンロードするとき。ブラウザはエラー「エラーが含まれているため画像を表示できません」を表示します。どんな助けでも大歓迎です。Webブラウザは、符号なしの文字配列を介して渡されたイメージを解釈しません。
#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);
}
これをデバッグしようとしましたか?たとえば、これが画像をどのように扱うかを見てみましょう。 (すなわち、バイト*同一*?) –