Получение сокета из HTTP сессии

Тема в разделе "WASM.NETWORKS", создана пользователем Sickle, 4 янв 2007.

  1. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    Вечер добрый! имеется WinInet сессия:
    Код (Text):
    1. InternetOpen
    2. InternetConnect
    3. HttpOpenRequest
    4. HttpAddRequestHeaders
    5. HttpSendRequest
    и вот после этого, нужно получить сокет, используемый данной сессией. как это можно выполнить?
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    стандартными средствами скорее всего никак, если нестандартными - ковырять/патчить код HttpSendRequest
     
  3. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    Cr4sh
    да блин wininet даже сокеты не импортирует... там черт ногу сломит.

    а если отвлечься от сокетов - есть ли способ проверить наличие коннекта с сервером в этой сессии?
     
  4. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    а что, так уже не катит?
    Код (Text):
    1. HINTERNET hConnect = InternetConnect(hSession, "ya.ru", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);
    2. if (hConnect == NULL)
    3.     dosmth();
    Cr4sh
    При чём здесь HttpSendRequest? Сокет раньше создаётся. К тому же, необязательно ковырять код этих функций, можно перехватывать сокет.
     
  5. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    riban
    InternetConnect уже произведен. нужно узнать, не потерян ли он спустя некоторое время после HttpSendRequest.

    поясни
     
  6. riban

    riban New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2005
    Сообщения:
    51
    Адрес:
    Russia
    Немного неверно выразился. Имел ввиду послушать сокет. Юзать libpcap/winpcap - но это тоже изврат.

    Вот тебе варианты, как проверить соединение:

    1. Послать HEAD запрос - если не вернулся (Проверить с помощью GetLastError) - коннект пропал (хотя он должен закрываться с помощью InternetCloseHandle)

    2. Юзать InternetCheckConnection

    3. Собственно, вариант получения сокета:
    Код (Text):
    1. BOOL InternetQueryOption(
    2.   HINTERNET hInternet,
    3.   DWORD dwOption,
    4.   LPVOID lpBuffer,
    5.   LPDWORD lpdwBufferLength
    6. );
    в качестве dwOption подставишь INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO и получишь следующую структуру:
    Код (Text):
    1. typedef struct {
    2.   DWORD_PTR Socket;
    3.   DWORD SourcePort;
    4.   DWORD DestPort;
    5.   DWORD Flags;
    6. } INTERNET_DIAGNOSTIC_SOCKET_INFO,
    7.  * LPINTERNET_DIAGNOSTIC_SOCKET_INFO;
    дескриптор сокета, завязанного на коннекте, понятно где.
     
  7. Sickle

    Sickle New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    181
    riban
    пункт 2 - разве эта функция не проверяет лишь наличие связи с интернетом?
    пункт 3 - Благодарю! это именно то, что я хотел видеть!