Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> соеденить два сокета, CAsyncSocket 
:(
    Опции темы
BSOD
Дата 4.9.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно пример, как соеденить два CAsyncSocket? плз. 
Не-то у меня не получается, я делаю так: 
наследую от CAsyncSocket два класса (клиент и сервер), 
клиент: 
Код

class CTCPClient: public CAsyncSocket 

private: 
   int SockPort; 
   bool Connected; 
   CDialog* dialog; 
public: 
   void OnReceive(int nErrorCode); 
public: 

   CTCPClient(int,CDialog*); 

   bool Connect(LPCTSTR,int); 
   void Disconnect(); 
   bool SendText(CString); 
}; 


Сервер:
Код

class CTCPServer: public CAsyncSocket 

private: 
   void (*process)(CString,CTCPServer*); 
   void OnReceive(int); 
   void OnAccept(int); 
   void OnClose(int); 
public: 
   CTCPServer(int,void (*func)(CString,CTCPServer*)); 
   bool SendText(CString text); 
}; 


потом на одном конце создаю сервер и ставлю его слушать (server.Listening()) 

на другом создаю клиент и пытаюсь приконнектится: 

Код

bool CTCPClient::Connect(LPCTSTR ip, int port) 

   if (CAsyncSocket::Connect(ip,port)) 
   {return true; Connected = true;} 
   else return false; 
}; 


на другом ловлю OnAccept: 

Код

void CTCPServer::OnAccept(int nErrorCode) 

   CAsyncSocket* hoi; 
   hoi = new CAsyncSocket(); 
   CAsyncSocket::Accept(*hoi); 
   SendText(CString("HOI")); 
}; 


тока они почему-то не коннектяццо, OnAccept случается, но ниче не делает, а CAsyncSocket::Connect(ip,port) возвращает не 0..


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
ptr
Дата 7.9.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



BSOD, давай полностью всю программу.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
BSOD
Дата 9.9.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот исходники:
http://leonovich.h14.ru/net.rar


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Athlon
Дата 11.9.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 15.1.2006
Где: Украина:: Запорож ье

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



Вот своеобразный пример связи двух сокетов(правда наследованых от CSocket), которые управляются из диалогового окна:
Прослушающий сокет, сервер:
Код

// h-файл
class CServerDlg;

class CListenSocket : public CSocket  
{
protected:
    CServerDlg* pdlg;
public:
    CListenSocket(CServerDlg* m_dlg);
    virtual ~CListenSocket();
    virtual void OnAccept(int nErrorCode);

};

// cpp-файл
CListenSocket::CListenSocket(CServerDlg* m_dlg)
{
    pdlg = m_dlg;
}

CListenSocket::~CListenSocket()
{
}

void CListenSocket::OnAccept(int ErrorCode)
{
    if(!pdlg->accept_client()) return;
    CSocket::OnAccept(ErrorCode);
}


Клиент:
Код

//h-файл

# define limiter '#'

class CServerDlg;

class CServerSocket : public CSocket  
{
protected:
    int index;
    CServerDlg* pdlg;
public:
    CString knowlege_base_file;
    CServerSocket(CServerDlg* m_dlg, int ndx);
    virtual ~CServerSocket();
    virtual void OnReceive(int nErrorCode);
    virtual void OnClose(int nErrorCode);
};

// cpp-файл
CServerSocket::CServerSocket(CServerDlg* m_dlg, int ndx):index(ndx), pdlg(m_dlg)
{
}

CServerSocket::~CServerSocket()
{
}

void CServerSocket::OnReceive(int nErrorCode) 
{

    char buff[4096];    
    int nRead;
    nRead = Receive(buff, 4096);
    if(nRead == SOCKET_ERROR)
    {
        AfxMessageBox("ServerSocket :: OnReceive ERROR !!!");
        return;
    }
    buff[nRead] = '\0'; 
    char msg_type = buff[0];
    //отделяю префикс от сообщения
    CString message = buff;
    message.Delete(0, 1);
    switch (msg_type)
    {
        case 't':
        {
            pdlg->question_selected(index, message);
            break;
        } 
....................................
        case 'a':
        {
            pdlg->receive_answer(index, message);
            break;
        } 
        default:
        {            
            message=buff;
            pdlg->default_receive(message);
        }
    }
    CSocket::OnReceive(nErrorCode);
}

void CServerSocket::OnClose(int nErrorCode) 
{
    pdlg->close_client(index);
    CSocket::OnClose(nErrorCode);
}


и функции диалога для работы с сокетами:
Код

bool CServerDlg::accept_client()
{
    if(!free_socks->not_empty())
    {
        m_list.AddString("Not enougth sockets to connect client");
        scroll_list();
        return false;
    }
    int* index = free_socks->get_head();
    s_sock[*index] = new CServerSocket(this, *index);
    if(l_sock->Accept(*s_sock[*index]))
    {
        m_list.AddString("Client Connected - Ok !!!");
......................................................................
        for(CList_templ<askable_atr>::List_node* cur = knowlege_base->get_safe_head();
            cur != NULL; cur = cur->next)
        {
            st = "l" + cur->inf->description + limiter;
            sock->Send(st, st.GetLength());            //отправка че-нибудь клиенту
        }
    }
    else
    {
        m_list.AddString("Accept - failed !!!");
        delete s_sock[*index];
        s_sock[*index] = NULL;
        delete attributes[*index];
        attributes[*index] = NULL;
    }
    delete index;
    scroll_list();
    return true;
}

void CServerDlg::close_client(int index)
{
    s_sock[index]->Close();
    delete s_sock[index];
    s_sock[index] = NULL;
    free_socks->add_tail(new int(index));
    m_list.AddString("Client disconnected");
}


P.S. free_socks - это самописный шаблон списка указателей(в этом примере на сокеты, а не на носки smile )

P.P.S. чтоб меньше запутывать выбросил куски кода из accept_client, которые не относятся к сокетам.

Добавлено @ 18:45 
совсем из головы вылетело - клиент подключается к серверу весьма тривиально:
Код

if(c_sock->Connect(ip_addr, connect_dlg.m_port))
{
    //Ok
}
else
{
    //Fail
}
здесь ip_addr имеет тип CString, а connect_dlg.m_port - int.


Это сообщение отредактировал(а) Athlon - 11.9.2006, 18:37
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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