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


Автор: Игрь 15.11.2006, 18:10
Здравствуйте люди .... 


Вот решил замутить НТТР клиента ,чтобы профиксить принцип работы этого протокола...но появилась небольшая проблема... 

Всё что связано с НТМL данными всё чин чинарём, но когда программа клиент пытается загрузить gif/jpeg  всё  сразу стопорится, предварительно послав программу...клиенту какие то карамбули)))
А в асинхрнном режиме работы сокетов,просто пропускает загрузку изображений...что делать, как быть ? 

Да кстати,буфер у проги в видe char Buffer[1000000];

Огромное спасибо...

Автор: ptr 15.11.2006, 19:01
Показывай код.

Автор: Игрь 15.11.2006, 22:05
//---------------------------------------------------------------------------

#include <winsock2.h>
#include <iostream.h>
#pragma    hdrstop

//---------------------------------------------------------------------------
#pragma argsused
#define PORT 4444


int main(int argc, char* argv[])
{
   WSADATA wsaData;
   int err = WSAStartup(MAKEWORD(2, 0), &wsaData);
   if(err != 0)
   {
      cout<<"Does not manage to load library an socket"<<endl;
      Sleep(10000);
      return(1);
   }

   int Size;
   SOCKET Server,Client,Connect;
   unsigned long UlongMode;
   sockaddr_in ServerAddr,ClientAddr,ConnectAddr;
   hostent *host=NULL;
   char szServerName[1024];
   strcpy(szServerName,"127.0.0.1");


   if((Server=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
   return(1);

   UlongMode=1;
   ioctlsocket(Server,FIONBIO,(unsigned long*)&UlongMode);

   ServerAddr.sin_family=AF_INET;
   ServerAddr.sin_port=htons(PORT);
   ServerAddr.sin_addr.s_addr=htons(INADDR_ANY);



   if(bind(Server,(sockaddr*)&ServerAddr,sizeof(ServerAddr))==INVALID_SOCKET)return(1);

           if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
           return(1);
           ConnectAddr.sin_family=AF_INET;
           ConnectAddr.sin_port=htons(80);
           ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);




   listen(Server,5);
   FD_SET ReadSet;
   int ReadySock,ret;

   while(true)
   {

          if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
          return(1);
            ConnectAddr.sin_family=AF_INET;
            ConnectAddr.sin_port=htons(80);
            ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);

          if(ConnectAddr.sin_addr.s_addr==INADDR_NONE)
          {
           host=gethostbyname(szServerName);
           if(host==NULL)
           {
             cout<<"Error"<<endl;
             Sleep(1000);
             return(1);
           }
           CopyMemory(&ConnectAddr.sin_addr,host->h_addr_list[0],host->h_length);
          }

        FD_ZERO(&ReadSet);
    FD_SET(Server,&ReadSet);
        //timeval times;
        //times.tv_sec=2;
        //times.tv_usec=0;

        if ((ReadySock=select(0,&ReadSet,NULL,NULL,NULL))==SOCKET_ERROR)
    {
        MessageBox(0, "Select filed", "Error", 0);
    }

        if (FD_ISSET(Server,&ReadSet))
    {
        int iSize = sizeof(ClientAddr);
            Client=accept(Server,(sockaddr *)&ClientAddr, &iSize);
        if (Client == INVALID_SOCKET)
            {
            MessageBox(0, "Accept filed", "Error", 0);
            break;
        }
                cout<<inet_ntoa(ClientAddr.sin_addr)<<endl;
        }
         cout<<"ok"<<endl;
         char RecvBuff[1000000];
         while(true)
         {
           Sleep(20);
           ret=recv(Client,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Mistake acceptance data"<<endl;
             break;
           }

           if(ret==0)
           {
             cout<<"No pol send"<<endl;
             break;
           }
           RecvBuff[ret]='\0';
           cout<<RecvBuff<<endl;
           if(connect(Connect,(sockaddr*)&ConnectAddr,sizeof(ConnectAddr))==SOCKET_ERROR)
           {
              cout<<"Connect active\n"<<endl;
           }

           if((ret=send(Connect,RecvBuff,strlen(RecvBuff),0))==SOCKET_ERROR)

           {
              cout<<"Error send"<<endl;
              cout<<WSAGetLastError()<<endl;
              break;
           }
           memset(RecvBuff,0,sizeof(RecvBuff));
           ret=recv(Connect,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Conn sock error"<<endl;
             break;
           }
           if(ret==0)
           {
             cout<<"No pol send"<<endl;
             break;
           }
           RecvBuff[ret]='\0';
           cout<<RecvBuff<<endl;

           if((ret=send(Client,RecvBuff,strlen(RecvBuff),0))==SOCKET_ERROR)
           {
            cout<<"Not to manage to send data"<<endl;
            break;
           }
           memset(RecvBuff,0,sizeof(RecvBuff));

        }
        cout<<"Closed connected"<<endl;
        closesocket(Client);

   }
   cout<<"Closed server"<<endl;
   closesocket(Server);
   cin>>"";

 return(0);
}
//---------------------------------------------------------------------------

Автор: Игрь 16.11.2006, 01:45
Вообщем всё фишка в чём....
запускаешь прогу ,открываешь браузер и пишешь туда 127.0.0.1:4444
коннект браузера к проге....а прога потом шлёт запрос и выступает посредником между клиентом и реальным сервером....
Но картинкипочемуто не грузятся (((( 

Автор: ptr 18.11.2006, 17:40
Завтра посмотрю что там не так.

Кстати не забывай пользоваться кнопкой "Код".

Автор: ptr 19.11.2006, 11:40
Цитата(Игрь @  16.11.2006,  01:05 Найти цитируемый пост)
IPPROTO_IP

Наверное всё же IPPROTO_TCP.

Код

if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
          return(1);
            ConnectAddr.sin_family=AF_INET;
            ConnectAddr.sin_port=htons(80);
            ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);

Зачем повторяешь этот код два раза?

Код

 while(true)
         {
           Sleep(20);???
           ret=recv(Client,RecvBuff,sizeof(RecvBuff),0);

Не понял.

Код

 ret=recv(Connect,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Conn sock error"<<endl;
             break;
           }

Тут скорее всего должен быть цикл.

Автор: Игрь 20.11.2006, 03:01
Цитата(Игрь @  16.11.2006,  01:05 Найти цитируемый пост)
IPPROTO_IP

Наверное всё же IPPROTO_TCP.

Код

if((Connect=socket(AF_INET,SOCK_STREAM,IPPROTO_IP))==SOCKET_ERROR)
          return(1);
            ConnectAddr.sin_family=AF_INET;
            ConnectAddr.sin_port=htons(80);
            ConnectAddr.sin_addr.s_addr=inet_addr(szServerName);

Зачем повторяешь этот код два раза?
======================================
Сорри...просто копируя это дело на форум...я переборщил с Ctrl+V....и забыл затереть

Код

 while(true)
         {
           Sleep(20);???
           ret=recv(Client,RecvBuff,sizeof(RecvBuff),0);

Не понял.
==========================================================
А это задержка, для того чтобы функция recv успевала подчерпнуть пришедшие даные, которые приходят с задержкой..
Может из-за асинхронного режима...хз

Добавлено @ 03:09 
Так вот и не понятно...почему хтмл код проходит,а гифы и джейпеги нет...
выводит ошибку сокета...мол хотел получить данные,да не получилось(((

Добавлено @ 03:14 
Код

 ret=recv(Connect,RecvBuff,sizeof(RecvBuff),0);
           if(ret==SOCKET_ERROR)
           {
             cout<<"Conn sock error"<<endl;
             break;
           }

Тут скорее всего должен быть цикл.
========================================
Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...да кстати,огромное  спасибо за твоё внимание...

Автор: En_t_end 20.11.2006, 06:43
Цитата(Игрь @  20.11.2006,  07:01 Найти цитируемый пост)
Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...

нет

Автор: ptr 20.11.2006, 10:40
Цитата(Игрь @  20.11.2006,  06:01 Найти цитируемый пост)
А это задержка, для того чтобы функция recv успевала подчерпнуть пришедшие даные, которые приходят с задержкой..Может из-за асинхронного режима...хз

Не очень хорошее решение, а точнее даже бесполезное. Зачем тогда нужна асинхронность? Если ты хочешь использовать асинхронный режим, то должен корректно обрабатывать ошибки (например когда данных нет).

Цитата(Игрь @  20.11.2006,  06:01 Найти цитируемый пост)
выводит ошибку сокета...мол хотел получить данные,да не получилось(((

Что за ошибка.

Цитата(Игрь @  20.11.2006,  06:01 Найти цитируемый пост)
Зачем цикл , ведь буфер позволяет(своим размером) всё за один раз обработать...да кстати,огромное  спасибо за твоё внимание...

recv возвращает только те данные, которые в данный момент есть. Т.е., например, если ты посылаешь много данных, то за один раз они могут не прочитаться, просто не успеют дойти, поэтому тут нужен цикл. И такой большой буфер здесь просто не нужен.

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