Получить размер удалённого файла

Тема в разделе "WASM.NETWORKS", создана пользователем net_name, 3 сен 2009.

  1. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Здравствуйте, пожалуйста помогите найти ошибку в коде, которым пытаюсь получить размер файла на удалённом сервере в интернете через Winsock HTTP.
    Код (Text):
    1. #include "stdafx.h"
    2. #include <winsock2.h>
    3. #include <windows.h>
    4. #pragma comment(lib, "ws2_32.lib")
    5.  
    6. #define SERVER "localhost"
    7. #define PORT 80
    8.  
    9. int main()
    10. {
    11.     char sendbuffer[2048];
    12.  
    13.     // Формируем GET-пакет:
    14.     strcpy (sendbuffer, "GET http://www.kingdia.com/download/kingdia-video-converter.exe");      
    15.     strcat (sendbuffer, " HTTP/1.0\r\n");    
    16.     strcat (sendbuffer, "User-Agent: Opera\r\n");
    17.     strcat (sendbuffer, "Host: www.kingdia.com\r\n");
    18.     strcat (sendbuffer, "Connection: keep-alive\r\n");
    19.     strcat (sendbuffer, "\r\n\r\n");
    20.  
    21.     WSADATA wsaData;
    22.     SOCKET socketfd;
    23.     struct sockaddr_in server_addr;
    24.     struct hostent * h;
    25.     char response[1024*5];
    26.  
    27.     if(WSAStartup (MAKEWORD (2,2), &wsaData))
    28.     {
    29.         fprintf (stderr, "\nError intializing winsock library!");
    30.         return 1;
    31.     }
    32.    
    33.     for(int j = 1; j < 3; j++)
    34.     {
    35.         socketfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
    36.         if (socketfd < 0)
    37.         {
    38.             printf("Socket() error %d\n", GetLastError());
    39.             return -1;
    40.         }
    41.        
    42.         server_addr.sin_family = AF_INET;
    43.         server_addr.sin_port = htons (PORT);
    44.        
    45.         // преобразование IP адреса из символьного в сетевой формат
    46.         if (inet_addr(SERVER) != INADDR_NONE)
    47.             server_addr.sin_addr.S_un.S_addr = inet_addr (SERVER);
    48.         else
    49.        
    50.         // попытка получить IP адрес по доменному имени сервера
    51.         if (gethostbyname (SERVER))((unsigned long *)&server_addr.sin_addr)[0] = ((unsigned long **)h->h_addr_list)[0][0];
    52.        
    53.         else
    54.         {
    55.             printf("Invalid address %s\n",SERVER);
    56.             closesocket(socketfd);
    57.             WSACleanup();
    58.             return -1;
    59.         }
    60.        
    61.         // адрес сервера получен – пытаемся установить соединение
    62.         if (connect (socketfd, (const struct sockaddr*)&server_addr, sizeof(struct sockaddr)))
    63.         {
    64.             printf ("Connect error %d\n", GetLastError());
    65.             return -1;
    66.         }
    67.        
    68.         // отправка get-запроса
    69.         send (socketfd, sendbuffer, strlen (sendbuffer),0);
    70.        
    71.         // ответ сервера
    72.         recv (socketfd, &response[0], 2048, 0 );
    73.         printf ("%s\n", response);
    74.        
    75.         memset (&response, 0, sizeof (response));
    76.         closesocket (socketfd);
    77.         if (j == 2) break;
    78.        
    79.         Sleep (5000);
    80.     }
    81.    
    82.     WSACleanup ();
    83.     return 0;
    84. }
     
  2. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Да и кстати у меня NOD32 последний со свежими базами не даёт толком отладить файл, говорит, что это мол вирус... Пппц...
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    net_name
    оффтоп: ну раз фай на сервере удален, то и получать нечего :)
    1. вы задаете ip или dns name?
    2. а зачем это
    ну вообще антивирусы очень дружат с WinSock и почти каждое приложение, которое его юзает почти на каждом антивирусе является вирусов.
     
  4. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Да не он есть :) По ссылке качается же...
    Делаю универсально и так и так можно...
    Понятно, а можно как нубудь замаскироваться от антивируса?
     
  5. net_name

    net_name New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2009
    Сообщения:
    25
    Хотя бы от НОДа чтобы у меня на компе работало?
    Конечно можно в исключения добавить, а так чтобы програмно можно?
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    это то я понял из кода, а тестирование как производите. от того что возвращается из inet_addr(SERVER) зависит ход программы. остальные if вроде бы ведут к сигналам об ошибке.
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    кстати send и recv возвращают отправленное количество байт. проверьте на всякий случай и это.