![]() |
|
Модераторы: bsa |
![]()
|
|
| mustelus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.9.2009 Репутация: нет Всего: нет |
Доброго времени суток всем.
Извеняюсь если не по адресу вопрос: подскажите как вообще создаються клиент-серверные приложения работающие по сети и не по сети (на одном компе), какие платформы для таких проектов используються (создание самих серверов (HTTP, SMT... и локальных серверов), клиентских приложений)... Буду очень признателен если подскажете какую ни-ть литературу по возможности с примерами... В сети конечно есть статьи, примеры по етому поводу но в основном все по сетевым вопросам да и не очень понятно кроме как сам C++, хотелось бы сам механизм для начало подробно а там и все остальное.. Заранее спасибо... |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
1. сокеты, читать документацию своей ОС. например msdn для windows
2. кроссплатформенные обертки для сокетов, boost.asio 3. кроссплатформенные библиотеки для конкретного протолокола, например http, например libcurl для 1 компа - named pipes |
|||
|
||||
| mustelus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.9.2009 Репутация: нет Всего: нет |
Я дико извеняюсь...
Насчот сети, мне тут намикнули что с сетью с С++ лучше не лезть, для етой цели лучше подходит С#, Java... Ето так принципиально??? В Visual Studio2008 (MFC) есть вообще классы для сервака и клиента (клиент-серверное на одном компе, сеть) Спасибо... |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
mustelus, С# и Java сами по себе удобнее для программиста, чем C++. Производительность правда меньше.
В остальном все зависит от используемых библиотек. |
|||
|
||||
| mustelus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.9.2009 Репутация: нет Всего: нет |
Доброго времени суток госпада... Кажеться я зашол в тупик, мне не так тому давно посоветовали:
1. сокеты, читать документацию своей ОС. например msdn для windows 2. кроссплатформенные обертки для сокетов, boost.asio 3. кроссплатформенные библиотеки для конкретного протолокола, например http, например libcurl Эти все пункты используються в связке, или это список альтернативы? И еще не нашол инфы как использовать boost.asio P.S. есть куча примеров и в них пользуються именно классом Socket ....... Это сообщение отредактировал(а) mustelus - 21.5.2010, 22:48 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
mustelus, это альтернативы.
По boost.asio надо читать документацию, смотреть примеры, туториал. http://www.boost.org/doc/libs/1_43_0/doc/h...boost_asio.html http://www.boost.org/doc/libs/1_43_0/doc/h...sync_client.cpp |
|||
|
||||
| mustelus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.9.2009 Репутация: нет Всего: нет |
Огромное спасибо GoldFinch, вот теперь дошло в каком направлении двигаться далее...
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
надо отметить, что асио подразумевает хорошее понимание С++
как впрочем буст и стл вообще |
|||
|
||||
| mustelus |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 13.9.2009 Репутация: нет Всего: нет |
Проблемка, не конектиться клиент по ethernet (два компа напрямую, сервак передает клиенту строку), но если взять систему на локальном компе то все работает (какое свойство определено не правильно)???
сервак: #include "stdafx.h" #include "Server.h" #include "ServerDlg.h" #include "sa.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CSocket SendSocket; // CAboutDlg dialog used for App About 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() // CServerDlg dialog CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/) : CDialog(CServerDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CServerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CServerDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &CServerDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CServerDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3, &CServerDlg::OnBnClickedButton3) END_MESSAGE_MAP() // CServerDlg message handlers BOOL CServerDlg::OnInitDialog() { CDialog::OnInitDialog(); m_edit1 = static_cast<CEdit *>(GetDlgItem(IDC_EDIT1)); // 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 return TRUE; // return TRUE unless you set the focus to a control } void CServerDlg::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 CServerDlg::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 CServerDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CServerDlg::OnBnClickedButton1() { // TODO: Add extra validation here AfxSocketInit(); // Иннициализация системы сокетов CSocket MySocket; //создаем класс сокета сервера if(!MySocket.Create(22222)) MessageBox("Не могу создать сокет сервера","",MB_OK); // вызываем функцию создания и иннициализации сокета MySocket.Listen(); // слушаем запросы от клиентов MySocket.Accept(SendSocket); // принимает запрос на соединение // переменная SendSocket определена как клас CSocket MessageBox("Готов к передаче","",MB_OK); // сообщаем о готовности обмена данными } void CServerDlg::OnBnClickedButton2() { // TODO: Add extra cleanup here SendSocket.Close(); // Закрываем сокет CDialog::OnCancel();// Закрывем программу } void CServerDlg::OnBnClickedButton3() { int BuffLenght = m_edit1->LineLength(); // Вычисляем длину сообщения SendSocket.Send(&BuffLenght,4); // Посылаем клиенту длинну сообщения. char* Buffer = new char[BuffLenght]; // подготавливаем буффер для введенного текста m_edit1->GetLine(0,Buffer,BuffLenght); //записываем введенную строку в буфер SendSocket.Send(Buffer,BuffLenght); //посылаем строку клиенту... delete Buffer; //удаляем буфер } клиент: #include "stdafx.h" #include "klient.h" #include "klientDlg.h" #include "MySocket.h" #ifdef _DEBUG #define new DEBUG_NEW #endif CSocket MySocket1; // CAboutDlg dialog used for App About 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() // CklientDlg dialog CklientDlg::CklientDlg(CWnd* pParent /*=NULL*/) : CDialog(CklientDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CklientDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CklientDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &CklientDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CklientDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON3, &CklientDlg::OnBnClickedButton3) END_MESSAGE_MAP() // CklientDlg message handlers BOOL CklientDlg::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 return TRUE; // return TRUE unless you set the focus to a control } void CklientDlg::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 CklientDlg::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 CklientDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CklientDlg::OnBnClickedButton1() { // TODO: Add extra validation here if(!MySocket1.Create()) {MessageBox("Не могу создать сокет","",MB_OK);} // создание сокета..... if(!MySocket1.Connect("192.168.0.94",22222)) {MessageBox("Не могу создать соединение","",MB_OK);} } void CklientDlg::OnBnClickedButton2() { // TODO: Add extra cleanup here MySocket1.Close(); // Закрываем сокет CDialog::OnCancel(); // Закрывем программу } void CklientDlg::OnBnClickedButton3() { // TODO: Add your control notification handler code here int BufferLenght=10; MySocket1.Receive(&BufferLenght,4); char* Buffer = new char[BufferLenght+1]; Buffer[BufferLenght]=0; MySocket1.Receive(Buffer,BufferLenght); MessageBox(Buffer,"",MB_OK); delete Buffer; } void MySocket::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class int BufferLenght=10; // переменная длины буфера должна быть проинициализирована Receive(&BufferLenght,4); //принимаем длину следующего пакета char* Buffer = new char[BufferLenght+1]; //выделяем память под буфер в который щас будем принимать // пакет (сообщение) Buffer[BufferLenght]=0; // записываем 0 в конец строки, чтоб получился ASCIIZ формат. Receive(Buffer,BufferLenght); //принимаем строку..... MessageBox(NULL,Buffer,"",MB_OK); // выводим месаджбокс delete Buffer; //освобождаем память CSocket::OnReceive(nErrorCode); } спасибо P.S. заранее sorry за супер-дилетанский вопрос: какие библиотеки лучше применять при работе в сети Socket-ы, библиотеки curl, обертки boost.asio или чем тое еще (просто еще не полностью представляю сетевой кодинг) Это сообщение отредактировал(а) mustelus - 26.5.2010, 17:52 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |