Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-серверное приложение 
:(
    Опции темы
Agentx86
Дата 6.6.2009, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нашел я вот такой исходник на firststeps
Код

Сервер: 

CSocket ServerSocket, RecieveSocket; 
ServerSocket.Create(5544);
ServerSocket.Bind(5544, "192.168.93.1");
ServerSocket.Listen(5); 
ServerSocket.Accept(RecieveSocket); 
CSocketFile file(&RecieveSocket);
CArchive In(&file, CArchive::load);
CArchive Out(&file, CArchive::store); 
CString string;
In >> string; 
AfxMessageBox(string); 
ServerSocket.Close(); 

Клиент: 

CSocket ClientSocket;
ClientSocket.Create();
ClientSocket.Connect("192.168.93.1", 5544);
CString buffer = " Hello World";
ClientSocket.Send(buffer, 500, 0); 
ClientSocket.Close(); 



Запускаю. Сервер выдает ошибку. Проверяю отладчиком. 
Ошибка вот в этой строчке CSocketFile file(&RecieveSocket).
С одной стороны это логично. Клиент еще не подключился, а я уже пытаюсь принимать данные. Но с другой стороны для меня странно, что прошел accept. Поидее программа должна была зависнуть в этой точке и ждать подключения клиента. Ладно. 
Выношу вот этот кусок в отдельный поток
Код

for(;;)
    {
bool res=ServerSocket.Accept(RecieveSocket); 
if(res==true)
{
CSocketFile file( &RecieveSocket);
CArchive In(&file, CArchive::load);
CArchive Out(&file, CArchive::store); 
CString string;
In >> string; 
}
Sleep(1000);
    }

Запускаю сервер. Запускаю клиент. Клиент не коннектится. IP адрес указал 127.0.0.1 порт 5555(клиент/сервер). Что я делаю неправильно? Если у когото есть пожожий исходник, поделитесь.
PM MAIL   Вверх
Agentx86
Дата 6.6.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Немогу понять в чем проблема. 
Пишу вот эти две строчки
CSocket ServerSocket; 
ServerSocket.Create(5534)

Метод Create возвращает false. Что здесь можно сделать неправильно мне не понятно. Пробывал это на разных портах.

Добавлено через 4 минуты и 22 секунды
Понял в чем проблема. При создании приложения надо поставить галочку что будут использоваться сокеты.
PM MAIL   Вверх
Agentx86
Дата 8.6.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не получается поместить accept в отдельный поток.
после вызова функции listen, запускаю поток.
вот код потоковой функции
Код

UINT accept_client(LPVOID lpParam )
{
    CSocket* pSocket = new CSocket;
    CSocket *m_main =(CSocket*) lpParam;
    m_main->Accept(*pSocket);
    
    
    return 0;
}

поток создаю вот так
Код

 AfxBeginThread(*accept_client,(void*)&m_mainSocket);

Причем я пробовал в потоковой функции обращаться к m_mainSocket как к глобальной переменной. Также пытался создать pSocket  глобально. Ничто не помогает. После запуска потока на строке с Accept выскакивает ошибка Debug Assertion Failed в sockcore.cpp.

Это сообщение отредактировал(а) Agentx86 - 8.6.2009, 00:53
PM MAIL   Вверх
Dreamer_0x01
Дата 9.6.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



AfxSocketInit() в каком месте запускали?
Надеюсь, до конструирования сокетов и Create() ?

Цитата

После запуска потока на строке с Accept выскакивает ошибка Debug Assertion Failed



А в каком месте запускается сама потоковая функция?
Очень похоже, что сокет, указатель на который передан в lpParam, до этого момента не был проинициализирован как надо.


Это сообщение отредактировал(а) Dreamer_0x01 - 9.6.2009, 13:37


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Agentx86
Дата 10.6.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dreamer_0x01 @  9.6.2009,  13:29 Найти цитируемый пост)
AfxSocketInit() в каком месте запускали?
Надеюсь, до конструирования сокетов и Create() ?


Цитата

После запуска потока на строке с Accept выскакивает ошибка Debug Assertion Failed





А в каком месте запускается сама потоковая функция?
Очень похоже, что сокет, указатель на который передан в lpParam, до этого момента не был проинициализирован как надо.

AfxSocketInit() запускал после Create. Перенес т.к. надо. Ошибка не исчезла. Вот создал чистое приложение, чтобы ничего лишнего не отвлекало. 
Код

UINT accept_client(LPVOID lpParam )
{
    CSocket pSocket;
    CSocket *m_main =(CSocket*) lpParam;
    ServerSocket.Accept(RecieveSocket);
    return 0;
}
void CservDlg::OnBnClickedButton1()
{
AfxSocketInit(); 
ServerSocket.Create(5544);
ServerSocket.Bind(5544, "127.0.0.1");
ServerSocket.Listen(5); 
 AfxBeginThread(*accept_client,(void*)&ServerSocket);
}

PM MAIL   Вверх
Agentx86
Дата 11.6.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Большо спасибо, Dreamer_0x01
Помог решить проблему. Главная проблема была это то что я ServerSocket объявил глобально.
Еще один вопросик есть. Как перевести сокет в синхронный режим(блокирующий)?
PM MAIL   Вверх
Agentx86
Дата 19.6.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хочу сам подключать клиентов в отдельном потоке. Написал вот такой код.
Код

// servDlg.cpp : implementation file
//

#include "stdafx.h"
#include "serv.h"
#include "servDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

UINT accept_client(LPVOID lpParam )
{
    
    CSocket *m_main =(CSocket*) lpParam;    
    CSocket pSocket;
    
    for(;;)
    {
        m_main->Accept(pSocket);
    }
    return 0;
}

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

// Dialog Data
    enum { IDD = IDD_ABOUTBOX };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
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()


// CservDlg dialog




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

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

BEGIN_MESSAGE_MAP(CservDlg, CDialog)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_BUTTON1, &CservDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CservDlg message handlers

BOOL CservDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    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);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here
AfxSocketInit(); 
    return TRUE;  // return TRUE  unless you set the focus to a control
}

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

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CservDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

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

        // Center icon in client rectangle
        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;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
    
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CservDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}


void CservDlg::OnBnClickedButton1()
{
    
    CSocket ServerSocket;
    ServerSocket.Create(500,SOCK_STREAM,NULL);
    ServerSocket.Bind(500, "127.0.0.1");
    ServerSocket.Listen(); 
    AfxBeginThread(*accept_client,(void*)&ServerSocket);
}

Не работает, потомучто сокет работает в асинхронном режиме. Прочитал для того, чтобы передать сокет в поток нужно использовать Attach и Detach. Чтото у меня не получается это сделать. Пример из МСДНа не очень понял. Можете подправить этот код при помощи Attach и Detach, так чтобы функция Accept работал синхронно. Или объясните на пальцах как использовать эти методы. Заранее, большое спасибо.

Это сообщение отредактировал(а) Agentx86 - 19.6.2009, 13:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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