Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с сокетами в MFC, Не могу получить ответ от сервера 
V
    Опции темы
TerminalSoul
Дата 24.9.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот пытаюсь написать программу, которая бы тащила с сайта(в данном случае mail.ru) HTML код, и потом обрабатывала, но проблема в том, что после отправки пакета не вызывается OnReceive(). Базовый класс сокета CAssyncSocket. 

Вот метод отправки сообщения:
Код


int CClientSocket::SendPacket(char *link)
{
    int ipacket,res;
    CString packet,lnk;
    lnk=link;
    packet="GET ";
    packet+=lnk;
    packet+=" HTTP/1.1\r\n Host: mail.ru\r\n Connection: Keepa-Alive\r\n \r\n";
    ipacket=packet.GetLength();
    res=Send(LPCTSTR(packet),ipacket);
    return res;
}




А вот метод Init()



Код

void CClientSocket::Init()
{
    bool res;
    Create();
    res=Connect("217.69.128.42",80);
}






А вот собственно метод, вызываемый после нажатия на кнопку:


Код

void Ctrysocket1Dlg::OnGO()
{
     clint.Init();
     clint.SendPacket("http://www.mail.ru");
}




Что не так или может я вообще пытаюсь штаны через голову одеть и надо делать по другому?

PM MAIL   Вверх
Alca
Дата 24.9.2009, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

\r\n \r\n


Код

\r\n\r\n


Добавлено через 22 секунды
Нафиг там пробел?


--------------------
PM WWW ICQ Skype Jabber   Вверх
TerminalSoul
Дата 24.9.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хм, да нет собственно пробел там на фиг не нужен, но проблемы это не решает. Мне просто интересно, беда в том что сервер ответ не шлёт или в том, что я не обрабатываю запрос как надо.
Я так понимаю, что после посылки запроса, когда придёт ответ программа должна вызвать метод OnReceive  в котором я должен юзать сам Receive. Но OnReceive ваще не включается, второй день бьюсь...
PM MAIL   Вверх
SenkraD
Дата 24.9.2009, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



TerminalSoul, я нигде не вижу вызова CAsyncSocket::Receive -
сокет хоть а асинхронный, но кто-то должен ему скомандовать принять
данные

Это сообщение отредактировал(а) SenkraD - 24.9.2009, 18:46


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
TerminalSoul
Дата 24.9.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если после вызова Send, вызвать Receive он вернет -1, что означает принимать нечего, а Receive должен быть вызван из OnReceive, который как раз не вызывается ну код вот он:
Код


void Ctrysocket1Dlg::OnReceive()
{
    int res,ibuf;
    char *buf=new char[1025];
    ibuf=1024;
    CString mess;
    res=clint.Receive(buf,ibuf);
    buf[ibuf]=NULL;
    mess=buf;
    GetDlgItem(IDC_EDIT1)->SetWindowTextA(mess);

}

Класс Ctrysocket1Dlg не производный от CAsyncSocket но он вызывается из такого же OnReceive, который находится в классе сокета.

Это сообщение отредактировал(а) TerminalSoul - 24.9.2009, 19:03
PM MAIL   Вверх
SenkraD
Дата 24.9.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Давай сюда весь код касчающийся  сокета и работы с ним


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
TerminalSoul
Дата 24.9.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тут половина это стандартный код, который VisualStudio генерит... 



ClientSocket.h
Код

#pragma once

// конечный объект команды CClientSocket
class CClientSocket : public CAsyncSocket
{
private:
    CDialog* m_pwnd;
    virtual void OnReceive(int nErrorCode);
    virtual void OnConnect(int nErrorCode);
    virtual void OnSend(int nErrorCode);
public:
    void Init();
    CClientSocket();
    int SendPacket(char *link);
    void SetParent(CDialog* pwnd);
    virtual ~CClientSocket();
};


ClientSocket.cpp
Код

// ClientSocket.cpp: файл реализации
//

#include "stdafx.h"
#include "trysocket1.h"
#include "ClientSocket.h"
#include "trysocket1Dlg.h"


// CClientSocket

CClientSocket::CClientSocket()
{
}
void CClientSocket::Init()
{
    bool res;
    Create();
    res=Connect("217.69.128.42",80);
}
int CClientSocket::SendPacket(char *link)
{
    int ipacket,res;
    CString packet,lnk;
    lnk=link;
    packet="GET ";
    packet+=lnk;
    packet+=" HTTP/1.1\r\nHost: mail.ru\r\nConnection: Keepa-Alive\r\n\r\n";
    ipacket=packet.GetLength();
    res=Send(LPCTSTR(packet),ipacket);
    return res;
}
void CClientSocket::SetParent(CDialog *pwnd)
{
    m_pwnd=pwnd;
}
void CClientSocket::OnReceive(int nErrorCode)
{
    ((Ctrysocket1Dlg *)m_pwnd)->OnReceive();
}
void CClientSocket::OnConnect(int nErrorCode)
{
    ((Ctrysocket1Dlg *)m_pwnd)->OnConnect();
}
void CClientSocket::OnSend(int nErrorCode)
{
    ((Ctrysocket1Dlg *)m_pwnd)->OnSend();
}
CClientSocket::~CClientSocket()
{
    Close();
}


// функции-члены CClientSocket



trysocket1Dlg.h
Код

// trysocket1Dlg.h : файл заголовка
//

#pragma once

// диалоговое окно Ctrysocket1Dlg
class Ctrysocket1Dlg : public CDialog
{
// Создание
public:
    Ctrysocket1Dlg(CWnd* pParent = NULL);    // стандартный конструктор
    CClientSocket clint;
// Данные диалогового окна
    enum { IDD = IDD_TRYSOCKET1_DIALOG }; 
    virtual void OnReceive();
    virtual void OnConnect();
    virtual void OnSend();
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV


// Реализация
protected:
    HICON m_hIcon;

    // Созданные функции схемы сообщений
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnGO();
    DECLARE_MESSAGE_MAP()
};



trysocket1Dlg.cpp
Код

// trysocket1Dlg.cpp : файл реализации
//

#include "stdafx.h"
#include "trysocket1.h"
#include "ClientSocket.h"
#include "trysocket1Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Диалоговое окно CAboutDlg используется для описания сведений о приложении

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Данные диалогового окна
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // поддержка DDX/DDV

// Реализация
protected:
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// диалоговое окно Ctrysocket1Dlg




Ctrysocket1Dlg::Ctrysocket1Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(Ctrysocket1Dlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void Ctrysocket1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(Ctrysocket1Dlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_COMMAND(IDC_BUTTON1,OnGO)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


// обработчики сообщений Ctrysocket1Dlg

BOOL Ctrysocket1Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    clint.SetParent(this);
    // Добавление пункта ''О программе...'' в системное меню.

    // IDM_ABOUTBOX должен быть в пределах системной команды.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Задает значок для этого диалогового окна. Среда делает это автоматически,
    //  если главное окно приложения не является диалоговым
    SetIcon(m_hIcon, TRUE);            // Крупный значок
    SetIcon(m_hIcon, FALSE);        // Мелкий значок

    // TODO: добавьте дополнительную инициализацию

    return TRUE;  // возврат значения TRUE, если фокус не передан элементу управления
}

void Ctrysocket1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
//  чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,
//  это автоматически выполняется рабочей средой.

void Ctrysocket1Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // контекст устройства для рисования

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Выравнивание значка по центру клиентского прямоугольника
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Нарисуйте значок
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// Система вызывает эту функцию для получения отображения курсора при перемещении
//  свернутого окна.
HCURSOR Ctrysocket1Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}
void Ctrysocket1Dlg::OnGO()
{
     clint.Init();
     clint.SendPacket("http://www.mail.ru");
    
}
void Ctrysocket1Dlg::OnReceive()
{
    int res,ibuf;
    char *buf=new char[1025];
    ibuf=1024;
    CString mess;
    res=clint.Receive(buf,ibuf);
    buf[ibuf]=NULL;
    mess=buf;
    GetDlgItem(IDC_EDIT1)->SetWindowTextA(mess);

}
void Ctrysocket1Dlg::OnConnect()
{
GetDlgItem(IDC_EDIT1)->SetWindowTextA("Connected");
}
void Ctrysocket1Dlg::OnSend()
{
GetDlgItem(IDC_EDIT1)->SetWindowTextA("Sended");
}

PM MAIL   Вверх
SenkraD
Дата 24.9.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробуй так 
Код

void CClientSocket::Init()
{
    Create();
    AsyncSelect(FD_READ | FD_CLOSE);
    Connect("217.69.128.42",80);
}



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
TerminalSoul
Дата 24.9.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не прокатывает, я видимо чего-то не понимаю...
PM MAIL   Вверх
SenkraD
Дата 25.9.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У тебя конеект асинхронный - нужно посылать запрос SendPacket в OnConnect


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
TerminalSoul
Дата 25.9.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Бальшое спасибо
SenkraD.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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