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

Поиск:

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


Новичок



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

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



Написал под Window на MFC программу клиент-сервер тока она может работать только с одним клиентом. Как сделать чтобы сервер мог принимать подключение нескольких клиентов.
Как можно определить от какого клиента получено сообщение?
PM MAIL   Вверх
Rickert
Дата 13.12.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



andrew_, что значит "от какого клиента"? По IP или каждой копии программы присваивать уникальный номер, который отсылать, при установке соединения.

ЗЫ
А ты пробовал присоедниться несколькоими клиентами?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
andrew_
Дата 13.12.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Rickert @  13.12.2006,  09:22 Найти цитируемый пост)
А ты пробовал присоедниться несколькоими клиентами? 


Да на одном компе открыл три экземпляра два клиента и один сервер. При подключении одного клиента все нормально, при подключении второго сервак аварийно завершается.

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


Опытный
**


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

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



Показывай код.


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


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



andrew_, это в коде ощибка. ИМХО. Исходник надо смотреть smile


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
andrew_
Дата 14.12.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот код
Код

// ServerclientDlg.h : header file
//

#pragma once
#pragma comment (lib,"NetAPI32.lib")
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <assert.h>
#include <windows.h> 
#include <lm.h>
#include "MySocket.h"
#include "ClientSocket.h"
#include "ConByIP.h"
#include "afxwin.h"
#include "afxext.h"
#include "byname.h"

// CServerclientDlg dialog
class CServerclientDlg : public CDialog
{
// Construction
public:
    CServerclientDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    enum { IDD = IDD_SERVERCLIENT_DIALOG };

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


// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    void OnAccept();
    void OnReceive();
    void OnConnect(); 
    void OnSend();
protected:
    CString m_sData;
    CMySocket m_pConnectSocket; //Передающий сокет
    CMySocket m_pListenSocket;    //Слушающий сокет
    CClientSocket m_pClientSocket;
public:
    afx_msg void OnBnClickedListen();
    afx_msg void OnBnClickedContoserver();
    afx_msg void OnBnClickedSend();
    afx_msg void OnMenu();
    afx_msg void OnUpdateMenu(CCmdUI *pCmdUI);
protected:
    CMenu* cm;
    CStatusBar m_wndStatusBar;
public:
    afx_msg void OnUpdateByip(CCmdUI *pCmdUI);
protected:
    CConByIP m_DlgIP;
    CString m_sIP;
public:
    BOOL ConnectToServer(CString IP, unsigned int PORT);
    BOOL ListenToClient(unsigned int PORT);
    afx_msg void OnUpdateCasserver(CCmdUI *pCmdUI);
    afx_msg void OnUpdateDisconnect(CCmdUI *pCmdUI);
    void CloseSockets(void);
    CListBox m_ListBox;
    void OnClose(void);
    CString m_sComputerName;
    CByName m_DlgByName;
    afx_msg void OnByname();
    afx_msg void OnProperty();
};


Код

// ServerclientDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Serverclient.h"
#include "ServerclientDlg.h"
#include ".\serverclientdlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

static UINT indicators[]=
    {
        IDS_STRING1,
        IDS_STRING2,
        IDS_STRING3,        // идентификатор второй строки в ресурсах
        IDS_STRING4
    };

// CServerclientDlg dialog



CServerclientDlg::CServerclientDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CServerclientDlg::IDD, pParent)
    , m_sData(_T(""))
    , m_sIP(_T(""))
    , m_sComputerName(_T(""))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CServerclientDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_DATA, m_sData);
    DDX_Control(pDX, IDC_MLIST, m_ListBox);
}

BEGIN_MESSAGE_MAP(CServerclientDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_BN_CLICKED(IDC_LISTEN, OnBnClickedListen)
    ON_BN_CLICKED(IDC_CONTOSERVER, OnBnClickedContoserver)
    ON_BN_CLICKED(IDC_SEND, OnBnClickedSend)
    ON_UPDATE_COMMAND_UI(ID_BYIP, OnUpdateByip)
    ON_UPDATE_COMMAND_UI(ID_CASSERVER, OnUpdateCasserver)
    ON_UPDATE_COMMAND_UI(ID_DISCONNECT, OnUpdateDisconnect)
    ON_COMMAND(ID_BYNAME, OnByname)
    ON_COMMAND(ID_PROPERTY, OnProperty)
END_MESSAGE_MAP()


// CServerclientDlg message handlers

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

    // 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
    //const char* g="Client";
    //cm = new CMenu;
    
    m_wndStatusBar.Create(this);                            // создать строку состояния
    m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)); // установить в строку идентификаторы
    CRect rect;
    GetClientRect(&rect);
    //Size the two panes
    m_wndStatusBar.SetPaneInfo(0,IDS_STRING1,SBPS_NORMAL,80);      
    m_wndStatusBar.SetPaneInfo(1,IDS_STRING2,SBPS_STRETCH,200);
    m_wndStatusBar.SetPaneInfo(2,IDS_STRING3,SBPS_STRETCH,80);
    m_wndStatusBar.SetPaneInfo(3,IDS_STRING4,SBPS_STRETCH,rect.Width()-360);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,IDS_STRING4);
    
    GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
    m_pListenSocket.SetParentDlg(this);
    m_pConnectSocket.SetParentDlg(this);
    m_pClientSocket.SetParentDlg(this);
    m_sComputerName="Noname";
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CServerclientDlg::OnAccept()
{
    //Переводим соединение на передающий сокет
    m_pListenSocket.Accept(m_pConnectSocket);
    GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
    m_wndStatusBar.SetPaneText(1,"Соединение установлено");
}

void CServerclientDlg::OnReceive()
{
    if(m_wndStatusBar.GetPaneText(3)=="Сервер")
    {
    m_wndStatusBar.SetPaneText(1,"Получены данные");
    char *pBuf=new char[1025];
    //Записываем полученные данные в pBuf
    //Записываем в n количество полученных байтов
    int n=m_pConnectSocket.Receive(pBuf, 1024);
    //Отсекаем лишние символы
    pBuf[n]=NULL;
    //Записываем данные в переменную, связанную с edit'ом
   // m_sData=pBuf;
    UpdateData(FALSE);
    m_ListBox.AddString(pBuf);
    }

    if(m_wndStatusBar.GetPaneText(3)=="Клиент")
    {
    m_wndStatusBar.SetPaneText(1,"Получены данные");
    char *pBuf=new char[1025];
    //Записываем полученные данные в pBuf
    //Записываем в n количество полученных байтов
    int n=m_pClientSocket.Receive(pBuf, 1024);
    //Отсекаем лишние символы
    pBuf[n]=NULL;
    //Записываем данные в переменную, связанную с edit'ом
   // m_sData=pBuf;
    UpdateData(FALSE);
    m_ListBox.AddString(pBuf);
    }

}

void CServerclientDlg::OnBnClickedListen()
{
    // TODO: Add your control notification handler code here
    //m_pListenSocket.Create(22222); 
    ListenToClient(22222);
    //m_wndStatusBar.SetPaneText(1,"Прослушивание порта");
}
void CServerclientDlg::OnConnect() 
{
    // TODO: Add your control notification handler code here
    //Подсоединяемся к серверу
        CString rSocketAddress;
        UINT rSocketPort;
        m_pConnectSocket.GetSockName(rSocketAddress,rSocketPort);
        m_ListBox.AddString(rSocketAddress);

        cm->EnableMenuItem(ID_CASSERVER,MF_GRAYED);
        cm->EnableMenuItem(ID_BYIP,MF_GRAYED);
        cm->EnableMenuItem(ID_BYNAME,MF_GRAYED);
        cm->EnableMenuItem(ID_DISCONNECT,MF_ENABLED);
        //m_wndStatusBar.SetPaneText(3,"Клиент");
        //m_wndStatusBar.SetPaneText(1,"Соединение установлено");
        GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
}

void CServerclientDlg::OnSend() 
{
    // TODO: Add your control notification handler code here
    //Пересылаем
}

void CServerclientDlg::OnBnClickedContoserver()
{
    // TODO: Add your control notification handler code here
    if(ConnectToServer("localhost",22222))
    {
        
    }
}

void CServerclientDlg::OnBnClickedSend()
{
    // TODO: Add your control notification handler code here
    UpdateData(TRUE); //Забираем данные из edit'а
    if(m_wndStatusBar.GetPaneText(3)=="Клиент")
    {
        CString temp=m_sComputerName+" : "+m_sData;
        m_ListBox.AddString(temp);
        if(m_pClientSocket.Send(temp, temp.GetLength()))
        {
            m_wndStatusBar.SetPaneText(1,"Данные отправлены");
        }
        else m_wndStatusBar.SetPaneText(1,"Данные не отправлены");
    }
    if(m_wndStatusBar.GetPaneText(3)=="Сервер")
    {
        CString temp=m_sComputerName+" : "+m_sData;
        m_ListBox.AddString(temp);
        if(m_pConnectSocket.Send(temp,temp.GetLength()))
        {
            m_wndStatusBar.SetPaneText(1,"Данные отправлены");
        }
        else m_wndStatusBar.SetPaneText(1,"Данные не отправлены");
    }
}


void CServerclientDlg::OnUpdateByip(CCmdUI *pCmdUI)
{
    // TODO: Add your command update UI handler code here
    if(m_DlgIP.DoModal()==IDOK)
    {
        if(ConnectToServer(m_DlgIP.m_sIP,m_DlgIP.m_uiPort))
        {
            m_sComputerName=m_DlgIP.m_Name;
        }
    }
}

BOOL CServerclientDlg::ConnectToServer(CString IP, unsigned int PORT)
{
    m_pClientSocket.Close();
    m_pClientSocket.Create();
    if(m_pClientSocket.Connect(IP, PORT))
    {
        cm->EnableMenuItem(ID_CASSERVER,MF_GRAYED);
        cm->EnableMenuItem(ID_BYIP,MF_GRAYED);
        cm->EnableMenuItem(ID_BYNAME,MF_GRAYED);
        cm->EnableMenuItem(ID_DISCONNECT,MF_ENABLED);
        GetDlgItem(IDC_CONTOSERVER)->EnableWindow(FALSE);
        GetDlgItem(IDC_LISTEN)->EnableWindow(FALSE);
        GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
        m_wndStatusBar.SetPaneText(3,"Клиент");
        m_wndStatusBar.SetPaneText(1,"Соединение установлено");
        GetDlgItem(IDC_SEND)->EnableWindow(TRUE);

    return TRUE;
    }
    else {
        m_wndStatusBar.SetPaneText(1,"Невозможно установить соединение");    
        return FALSE;
    }
}

BOOL CServerclientDlg::ListenToClient(unsigned int PORT)
{
    m_pListenSocket.Close();
    m_pListenSocket.Create(PORT);
    if(m_pListenSocket.Listen())
    {
        cm->EnableMenuItem(ID_CASSERVER,MF_GRAYED);
        cm->EnableMenuItem(ID_BYIP,MF_GRAYED);
        cm->EnableMenuItem(ID_BYNAME,MF_GRAYED);
        cm->EnableMenuItem(ID_DISCONNECT,MF_ENABLED);
        GetDlgItem(IDC_CONTOSERVER)->EnableWindow(FALSE);
        GetDlgItem(IDC_LISTEN)->EnableWindow(FALSE);
        //GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
        m_sComputerName="Server";
        m_wndStatusBar.SetPaneText(3,"Сервер");
        m_wndStatusBar.SetPaneText(1,"Ожидание подключения");
        //SOCKADDR* lpSockAddr;
        //int * lpSockAddrLen;
        
        return TRUE;
    }
    else return FALSE;
}

void CServerclientDlg::OnUpdateCasserver(CCmdUI *pCmdUI)
{
    if(ListenToClient(22222))
    {
    
    }
    // TODO: Add your command update UI handler code here
}

void CServerclientDlg::OnUpdateDisconnect(CCmdUI *pCmdUI)
{
    // TODO: Add your command update UI handler code here
    CloseSockets();
    cm->EnableMenuItem(ID_CASSERVER,MF_ENABLED);
    cm->EnableMenuItem(ID_BYIP,MF_ENABLED);
    cm->EnableMenuItem(ID_BYNAME,MF_ENABLED);
    cm->EnableMenuItem(ID_DISCONNECT,MF_GRAYED);
    GetDlgItem(IDC_CONTOSERVER)->EnableWindow(TRUE);
    GetDlgItem(IDC_LISTEN)->EnableWindow(TRUE);
    GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
    m_wndStatusBar.SetPaneText(3,"Нет");
    m_wndStatusBar.SetPaneText(1,"Нет");
}

void CServerclientDlg::CloseSockets(void)
{
    m_pListenSocket.Close();
    m_pConnectSocket.Close();
    m_pClientSocket.Close();
    m_pListenSocket.Create(22222);
    m_pClientSocket.Create();
}

void CServerclientDlg::OnClose(void)
{
    CloseSockets();
    cm->EnableMenuItem(ID_CASSERVER,MF_ENABLED);
    cm->EnableMenuItem(ID_BYIP,MF_ENABLED);
    cm->EnableMenuItem(ID_BYNAME,MF_ENABLED);
    cm->EnableMenuItem(ID_DISCONNECT,MF_GRAYED);
    GetDlgItem(IDC_CONTOSERVER)->EnableWindow(TRUE);
    GetDlgItem(IDC_LISTEN)->EnableWindow(TRUE);
    GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
    m_wndStatusBar.SetPaneText(3,"Нет");
    m_wndStatusBar.SetPaneText(1,"Соединение оборвано");
}

void CServerclientDlg::OnByname()
{
    // TODO: Add your command handler code here
    if(m_DlgByName.DoModal()==IDOK)
    {
        if(ConnectToServer(m_DlgByName.m_sCompName,m_DlgByName.m_uiPort))
        {
            m_sComputerName=m_DlgByName.m_sName;
        }
    }
}


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


 




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


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

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