c - 使用 C 语言的套接字编程下载图像

标签 c image sockets

我有一个程序,它下载与作为程序参数给出的链接相对应的 html 文件。接下来,我将解析 HTML 文件中的图像,并使用单独的 HTTP/1.0 连接下载它们并将它们存储在文件中。我面临的问题是文件写入完成后,图像查看器无法打开图像。 这是下载图像的函数::

void getImg(char imgUrl[],char cwd[],char fileName[]){

struct addrinfo hints;          
struct addrinfo *serverInfo;                                        // will point to the results
int socket_desc;                                                    // socket Descriptor
int status;
char port[4]="80";

printf("\n---------------------------------------\ngetImg \n\timgUrl:: %s\n\tcwd:: %s\n\tfilename:: %s\n\n",imgUrl,cwd,fileName);

//-------------------------REQUEST ---------------------------------------------
char message[500] = "GET ";
char hostUrl[300];
char *temp;

if(imgUrl[0]!='/'){
    imgUrl=strstr(imgUrl,"/")+1;
    imgUrl=strstr(imgUrl,"/")+1;
    temp=imgUrl;
    imgUrl=strstr(imgUrl,"/");
    strncpy(hostUrl,temp,(imgUrl-temp));
    strcat(message,imgUrl);
}
else{
    strcpy(hostUrl,host);

    if(pageUrl!=NULL)
        strcat(message,pageUrl);
    else
        strcat(message,"/");
    strcat(message,imgUrl+1);
}

strcat(message," HTTP/1.0\r\nHost: ");
strcat(message,hostUrl);
strcat(message,"\r\n\r\n");
printf("\n\n--------------------------------\nGET REQUEST::\n%s\n",message);



//-------------------------FILE ---------------------------------------------
FILE *img;
strcat(cwd,fileName);
img=fopen(cwd,  "w+");
// HANDLE fileHandle = (HANDLE)_get_osfhandle(fileno(img));

//-------------------------SOCKETS ---------------------------------------------
memset(&hints, 0, sizeof hints);                                    // make sure the struct is empty
hints.ai_family = AF_INET;                                          // don't care IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;                                    // TCP stream sockets

//-------------------------------------------------------------------GET ADDR INFO

status = getaddrinfo(hostUrl, port, &hints, &serverInfo);
if(status!=0){

    printf("Could Not Get AddrInfo Error:: %s\n",gai_strerror(status));
    exit(EXIT_FAILURE);
}

//------------------------------------------------------------------Create socket


socket_desc = socket(serverInfo->ai_family, serverInfo->ai_socktype, serverInfo->ai_protocol);
if (socket_desc == -1)
{
    printf("Could not create socket");
    exit(EXIT_FAILURE);
}


//------------------------------------------------------------------Connect to remote server using socket and server record

if (connect(socket_desc ,  serverInfo->ai_addr, serverInfo->ai_addrlen))
{
    printf("connect error");
    exit(EXIT_FAILURE);
}
printf("Connected \n---------\n");



if( send(socket_desc , message , strlen(message) , 0) < 0)
{
    printf("IMG Send failed :");
    exit(EXIT_FAILURE);
}
printf("IMG Data Sent\n");

//-------------------------------------------------------------------Receive a reply from the server
size_t rec_len=-1;
char reply[400], *replyStart;
replyStart=reply;
int headerFlag=1;
// printf("SIZE OF REPLY::%ld\n",sizeof(reply));
memset (reply, '\0', sizeof(reply));


printf("IMG REPLY:: \n");
while( (rec_len=recv(socket_desc,reply , sizeof(reply) -1, 0)) > 0){
    printf("\n%s\n",reply);
    if(headerFlag==1){
        if(strstr(reply,"HTTP/1.0 404 Not Found")!=NULL ){
            fclose(img);
            break;
        }
        replyStart=removeHeader(replyStart);
        assert(replyStart!=NULL);
    }

    if (img!=NULL)
    {   
        if(headerFlag==1){
            fwrite((void*)reply,sizeof(char),rec_len-(replyStart-reply),img);
            headerFlag=0;
        }
        else{
            fwrite((void*)reply,sizeof(char),rec_len,img);
        }
    }
    memset (reply, '\0', sizeof(reply));
}

if( rec_len==-1)
{
    printf("IMG Receive failed %s",strerror(errno));
    exit(EXIT_FAILURE);
}

fclose(img);
}



char* removeHeader(char *replyStart){
int i=0;
for(;i<12;i++){
    replyStart=strstr(replyStart,":")+1;
    assert(replyStart!=NULL);
}
replyStart=strstr(replyStart,"\n");

return replyStart;
}

最佳答案

您需要阅读标题,直到出现空行,然后开始复制图像数据。

关于c - 使用 C 语言的套接字编程下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22523195/

相关文章:

Java重新缩放图像创建半白半灰图像

java - 关闭在 HttpRequestHandler 的句柄中创建的套接字

c - 如何生成遵循特定顺序的三个子进程?

c - 这个 foo 函数是如何工作的?

php - 显示来自mysql数据库的图像问题

javascript - 我可以在js中更改图像和swf文件吗?

java - 如何处理 "Unexpected end of file from server"?

mysql - 通过socket与mysql交互

c - 二进制交织、二进制混合、交替位

c - 访问和修改局部静态变量