Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Скачивание файла по http на winsock


Автор: flintstone 19.12.2008, 18:11
Здравствуйте!
Может кто сталкивался со следующей проблемой:
Нужно скачать файл с Web-сервера используя winsock. С реализацией всё вроде понятно, 
заносим в массив параметры HTTP протокола.
Отправляем на сервер, и ждём получения ответа. 
Затем парсим тело ответа на наличие файла, заносим его в массив, и пытаемся записать в файл. 
Вроде в ответе содержиться массив действующего файла, а записывается какая-то чушь. 
Как записать правильно файл?
Код
int file_download(viod) // ф-ия скачки файла
{
   char sendbuffer[1024], recvbuffer[65535];

        strcpy(sendbuffer, "GET ");
        strcat(sendbuffer, "http://test1.ru/1.gif");
        strcat(sendbuffer, " HTTP/1.0\r\nHost: ");
        strcat(sendbuffer, "test1.ru");
        strcat(sendbuffer, "\r\n\r\n");

        memset(recvbuffer,0,sizeof(recvbuffer)-1);
        MessageBox(0,sendbuffer,"Send Buffer",0);

    SOCKET s = socket(AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN webaddr;
        webaddr.sin_addr.S_un.S_addr = resolve("test1.ru");
        webaddr.sin_family = AF_INET;
        webaddr.sin_port = htons(80);
    if(connect(s, (struct sockaddr *)&webaddr,sizeof(SOCKADDR_IN))) return -1;

    send(s, sendbuffer, strlen(sendbuffer),0);
    Sleep(2000);

    int i;
    while(i = recv(s,recvbuffer+strlen(recvbuffer),1,0))  // получаем ответ
    {if (i == SOCKET_ERROR) return -1;}
         MessageBox(0,recvbuffer,"Answer of Web Server",0);

      // parsing...
    char *temp;

    for(int i = 0; recvbuffer[i]!=0; ++i)
    {
        if((recvbuffer[i]=='\r')&&(recvbuffer[i+1]=='\n')&&
            (recvbuffer[i+2]=='\r')&&(recvbuffer[i+3]=='\n'))
        {temp = (char*)&recvbuffer[i]+4; break;}
    }
        MessageBox(0,temp,"Answer of Web Server",0);

        FILE *stream= fopen("1.gif", "wb");
          //fprintf(stream, temp);
          fwrite(&temp, sizaof(temp), 1, stream);
          fclose(stream);
     return 0;
}

Автор: jonie 20.12.2008, 13:21
http://www.codeproject.com/KB/IP/winsockintro02.aspx
там готовый пример есть...

Автор: Олег2005 20.12.2008, 13:25
flintstone, 

M
Олег2005
Впредь используйте тег CODE для текста программ

Автор: flintstone 21.12.2008, 17:07
Спасибо.
Олег2005, буду следующий раз более внимательным.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)