Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно получать данные с web-страницы, используя Сокеты 
:(
    Опции темы
quiz
Дата 17.10.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 15.8.2005

Репутация: нет
Всего: нет



Приложение должно циклично обращаться к определенному php-скрипту, который возвращает страницу с одной единственной записью типа "141;230;848". Эту запись нужно разделить по ";" и засунуть цифры в разные переменные и повторить все с начала.

Делаю я это примерно так:

Код

#define PORT 80
#define SERVERADDR "s.test.ru"

char buff[1000];
SOCKET my_sock;
sockaddr_in dest_addr;

String^ sendstr = "GET /run.php?id="+textBox2->Text+"&x="+xpos+"&y="+ypos+"&r="+rotate+" HTTP/1.0\r\nHost: s.test.ru\r\nConnection: Close\r\n\r\n";
char* buff2 = (char*)(void*)Marshal::StringToHGlobalAnsi(sendstr);


            // Шаг 1 - инициализация библиотеки Winsock
    if (WSAStartup(0x202, (WSADATA *)&buff[0]))
    {
        richTextBox1->AppendText("WSAStart error "+WSAGetLastError()+"\n");
    }

    // Шаг 2 - создание сокета
    my_sock = socket(AF_INET, SOCK_STREAM, 0);
    if (my_sock < 0)
    {
        richTextBox1->AppendText("Socket() error "+WSAGetLastError()+"\n");
    }

    // Шаг 3 - установка соединения
    // заполнение структуры sockaddr_in - указание адреса и порта сервера

    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    HOSTENT *hst;

    // преобразование IP адреса из символьного в сетевой формат
    if (inet_addr(SERVERADDR) != INADDR_NONE)
        dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
    else
    {
        // попытка получить IP адрес по доменному имени сервера
        if (hst = gethostbyname(SERVERADDR)) {
            ((unsigned long *)&dest_addr.sin_addr)[0] =
            ((unsigned long **)hst->h_addr_list)[0][0];
        } else    {
            richTextBox1->AppendText("Invalid address "+SERVERADDR+"\n");
            closesocket(my_sock);
            WSACleanup();
        }
    }

    // адрес сервера получен - пытаемся установить соединение
    if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
    {
        //richTextBox1->AppendText("Connect error "+WSAGetLastError()+"\n");
    } else {
        //richTextBox1->AppendText("Соединение с "+SERVERADDR+" успешно установлено\n");
    }


// Шаг 4 - чтение и передача сообщений

int nsize;

send(my_sock, buff2, strlen(buff2), 0);
nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0);

// тут парсинг buff[].... //

WSACleanup();



Если выполнять весь этот код каждый раз, то данные с сервера получаются без проблем, но слишком медленно. На одном компьютере обмен с сервером идет по 3 раза в секунду, а на более слабых - до 1 раза в 5 секунд.. никуда не годится.
Первая мысль - не нужно каждый раз выполнять создание сокета, получение ip, коннект и т.п. Сделал все коннекты и прочее один раз, и циклично повторял только этот кусок:

Код

send(my_sock, buff2, strlen(buff2), 0);
nsize = recv(my_sock, &buff[0], sizeof(buff) - 1, 0);

// тут парсинг buff[].... //


В итоге данные получаются только первый раз, а все следующие разы nsize=0 :( Что я делаю не так? Как получать строку с сервера максимально быстро? 
PM MAIL   Вверх
ИванМ
Дата 19.10.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: нет
Всего: 23



Страницу можно загрузить проще:
Код

string url = "s.test.ru";
WebRequest req = WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream stream = resp.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string s = sr.ReadToEnd();

PM MAIL   Вверх
dobradushny
Дата 10.11.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.11.2009
Где: Новгород

Репутация: нет
Всего: нет



Мне помогло, спасибо автору....
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.