c - Web 浏览器不解释通过无符号字符数组传递的图像

标签 c arrays sockets network-programming packet-capture

我想做的基本上是通过套接字捕获浏览器的 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/

相关文章:

c# - C#返回类数组中单个变量的数组

java - 如何使用Java中的objectinputstream多次从服务器读取文件

c - C 中的位掩码范围

arrays - 如何在 perl 中用现有数组声明数组?

c - 寻找Array Code C语言的GCD

javascript - GAE channel Api 与套接字

C 套接字读取太多数据

c - 带数组的后增量指针

c - "n * (rand()/RAND_MAX)"是否产生偏斜的随机数分布?

c - 带过滤器的 pcap_loop 不捕获任何数据包