Web浏览器不解释通过unsigned char数组传递的图像

我想要做的基本上是通过套接字捕获浏览器的HTTP GET请求并将该请求发送到Internet,然后捕获回复并将其发送回浏览器。 当转移仅由文本组成时,每件事都完美无缺。 但是在下载图像时。 浏览器给出错误“无法显示图像,因为它包含错误”。 任何帮助将不胜感激。

#include "cc352.h" #include  #include  #include  #include  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 ; d0){ //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用于C字符串,它们是0终止的。 0在二进制图像文件的中间完全有效。 所以你可能没有发送尽可能多的数据。 (或者甚至比你得到的数据还要多,如果图像包含0 ,可能甚至比你的缓冲区要多。)

如果不检查read调用是否成功,切勿对已传递的缓冲区执行任何操作。 你需要使用read的返回值,因为这是唯一可以告诉你有多少数据的东西。

您假设您将在一次read调用中读取整个请求。 没有什么可以保证的。

(我不明白你试图用wronwron ,而你的代码中没有必要使用wron 。还有一个memcpy函数。使用它而不是自己滚动。)

(你应该检查所有write呼叫的返回码。)

我没有完整地完成你的代码。 但是(其中一个)问题肯定是将缓冲区视为字符串缓冲区(即NULL终止缓冲区)。 特别是使用strlen()来查找缓冲区的大小。

例如这一行(在代码的末尾):

 write(connfd,wbuff,strlen(wbuff)) 

对于任何不包含纯文本数据的有效负载,这都会失败,就像图像一样。