На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > С++ winsock , Ошибок нет,но и запрос не отправляется.
      Доброе время суток.
      На Си ++ программирую неделю,возникла необходимость отправить GET запрос используя winsock.
      Набросал простенький код.Запустил сниффер HTTP запросов,запустил свою программу,программа отработала без ошибок,Но и в сниффере запрос не отобразился.На компьютере нет антивирусов фаэрволов, бредмауэр отключен.
      Помогите понять что я делаю не так.
      ExpandedWrap disabled
        #include <tchar.h>
        #include <winsock.h>
        #include <windows.h>
        #pragma comment(lib, "WSOCK32.lib")
        //преобразование имени в IP
        int get_addr(char *host_name)
        {
            int res = -1;
         
            HOSTENT *phe = gethostbyname(host_name);
            if (phe)
                for (int i = 0; i < 4; i++)
                    ((BYTE *)&res)[i] = phe->h_addr_list[0][i];
         
            return res;
        }
        //Отправка запроса
        int TestGet()
        {
             WSADATA wsa_data;
            if (WSAStartup(0x101, &wsa_data))
            {
            
             MessageBox(0,L"Error WSAStartup",0,0);  
            }
         
            if (wsa_data.wVersion != 0x101)
            {
            
               MessageBox(0,L"Error WSAStartup Version",0,0);
            }
         
            SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s == INVALID_SOCKET)
            {
                 MessageBox(0,L"Error Create Sock",0,0);
            }
         
            char host_name[256] = "vk.ru";
            int host_port = 80;
            char doc[256] = "/?act=login&email=xxx&pass=xxx";
         
            SOCKADDR_IN sa;
            sa.sin_family = AF_INET;
            sa.sin_port = htons(host_port);
            sa.sin_addr.S_un.S_addr = get_addr(host_name);
         
         
           if (connect(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
           {
               MessageBox(0,L"Err Connect",0,0);
              
           }
              
            char message[256]=
          
                "GET http://%s%s HTTP/1.1\r\n"
                "Host: %s\r\n"
                "Connection: Keep-Alive\r\n"
                "\r\n\r\n";
              
         
         send(s, message,sizeof(message),0) ;
          
            closesocket(s);
            WSACleanup();
            return 0;
        }
        Во-первых надо проверять результат функции send - показывает сколько реально отправлено, во-вторых зачем ты отправляешь sizeof(message)? Это 256 байт, хотя твое сообщение меньше.
          Исправил
          Заменил sizeof(message) на strlen(message) включил проверку.
          ExpandedWrap disabled
             if(send(s, message,strlen(message),0)==0) MessageBox(0,L"Error Send",0,0);

          Все равно ничего не отправляет.
          Достаточно подключить <winsock.h> и #pragma comment(lib, "WSOCK32.lib") или нужно еще что то?
            Цитата Angel @
            Исправил
            Заменил sizeof(message) на strlen(message) включил проверку.
            ExpandedWrap disabled
               if(send(s, message,strlen(message),0)==0) MessageBox(0,L"Error Send",0,0);

            Все равно ничего не отправляет.
            Достаточно подключить <winsock.h> и #pragma comment(lib, "WSOCK32.lib") или нужно еще что то?

            Цитата
            if(send(s, message,strlen(message),0)==0) MessageBox(0,L"Error Send",0,0);

            Результатом функции send является кол-во отправленных байт, просто выведи что он возвращает и сравни с кол-вом, которое хочешь отправить.
              Длину возвращает правильную!Запрос не отправляется.Я уже все что можно пересмотрел,перепробовал.Создал точно такую же программу на делфи.запрос отправляется.Сделал на С++ используя WinInet..тоже запрос не отправляется
              Видимо у меня что то с Visual Studio..такое может быть?

              Добавлено
              Создал новое консольное приложение,скопировал туда свой код и все заработало.
              Создал новое приложение Win32,пустой проэкт.скопировал свой код не работает)))))
              В чем магия????????Почему работает только в консольном приложении???
              Сообщение отредактировано: Angel -
                Цитата Angel @
                Длину возвращает правильную!Запрос не отправляется

                Возможно, ты закрываешь сокет раньше, чем физически отправляются
                данные:
                ExpandedWrap disabled
                  // ...
                     send(s, message,sizeof(message),0) ;
                   
                     Sleep(10000);// Попробуем подождать 10 секунд
                   
                     closesocket(s);
                     WSACleanup();
                  // ...
                Сообщение отредактировано: ЫукпШ -
                  Цитата ЫукпШ @
                  Цитата Angel @
                  Длину возвращает правильную!Запрос не отправляется

                  Возможно, ты закрываешь сокет раньше, чем физически отправляются
                  данные:
                  ExpandedWrap disabled
                    // ...
                       send(s, message,sizeof(message),0) ;
                     
                       Sleep(10000);// Попробуем подождать 10 секунд
                     
                       closesocket(s);
                       WSACleanup();
                    // ...

                  не помогает,да и мой код в консольном приложении работает.Не работает в Win32
                    А при создании win32 приложения ты в визарде какие галочки ставишь? Если ничего не меняешь, то создаеться оконное приложение, куда ты код свой вставляешь?
                      я ставлю галочку пустой проект,затем создаю файл .cpp,добавляю его в дерево проектов.
                        Angel
                        А отладчиком пробовал пройтись? Такое ощущение, что TestGet() у тебя из main() вообще не вызывается. Добавь в TestGet() еще один MessageBox, в самое начало, чтобы убедиться.
                          Цитата Pacific @
                          Angel
                          А отладчиком пробовал пройтись? Такое ощущение, что TestGet() у тебя из main() вообще не вызывается. Добавь в TestGet() еще один MessageBox, в самое начало, чтобы убедиться.

                          Пробовал.Вызывается.
                          Более того я решил проблему.
                          УДАЛИЛ ПРОЕКТ,СОЗДАЛ ЗАНОВО.все заработало...интересно все же что за косяк был..
                            Нда, интерфейс Винсока тут не виноват... :)
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0468 ]   [ 17 queries used ]   [ Generated: 19.04.24, 20:59 GMT ]