Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Клиент-сервер. помогите доделать.(C++)

28K
11 ноября 2007 года
getch()
18 / / 11.11.2007
Вообщем есть клиент и сервер уже написанные, бьюсь с внедрением в них следущих функций: по айпи клиента сервер находит в клиент.тхт ключ и отправляет его клиенту, клиент проверяет ключ и сообщает серверу "ок" или "еррор". Сервер записывает в лог.тхт дату\время\ответ клиента\адрес айпи, затем разрывает соединение.
пожалуйста помогите с их написанием.
350
12 ноября 2007 года
cheburator
589 / / 01.06.2006
Отрывок из моего проекта.
 
Код:
sockaddr_in sa;
    int namelen = sizeof(sa);
    if (::getpeername (socket.GetHandle(), (SOCKADDR*)&sa, &namelen) != 0)
        throw exception ("Can't define client's ip address");
// Теперь в sa.sin_addr.s_addr лежит ip-адрес клиента (4-байтное значение).
// Конвертировать в строку можно с помощью inet_ntoa.
28K
12 ноября 2007 года
getch()
18 / / 11.11.2007
cheburator, фенкс.
28K
13 ноября 2007 года
getch()
18 / / 11.11.2007
за 2часа мучений разобрался как работает inet_ntoa, откомпилировал. все гут. теперь как бы в файле лучшим образом найти э тот айпи и прочитть ключ к нему....вотъ в чем вопрос.
350
14 ноября 2007 года
cheburator
589 / / 01.06.2006
Хорошо.
Вот еще отрывок из того же проекта :) Там задача примерно такая же, только вместо ключа - условный номер клиентской машины.
Идея в том, чтобы файл с соответствиями IP->ключ загрузить сразу при старте программы и сохранить в std::map, а затем искать по IP нужный ключ (в моем случае - номер компьютера) в этом std::map.

Код:
// ЗАГРУЗИМ СООТВЕТСТВИЯ IP-АДРЕСОВ КЛИЕНТОВ И НОМЕРОВ КОМПЬЮТЕРОВ
    {
        ifstream file ("ip_num.ini");
        string str;
        while (!file.eof())
        {
            file >> str;
            // Найдем знак =
            size_t offset = str.find ('=');
            if (offset == string::npos)
                throw exception ("Wrong config.ini format");
            ULONG ip = inet_addr (str.substr (0, offset).c_str());
            DWORD comp = (DWORD) atoi (str.substr (offset+1).c_str());
            ip_comp_map.insert (pair<ULONG,DWORD>(ip, comp));
        };
    }
...
...
            // Определить номер компутера.
            sockaddr_in sa;
            int namelen = sizeof(sa);
            if (::getpeername (socket.GetHandle(), (SOCKADDR*)&sa, &namelen) != 0)
                throw exception ("Can't define client's ip address");
            TerminalServer::ip_comp_map_type::const_iterator iter = TerminalServer::get()->GetIpCompMap().find (sa.sin_addr.s_addr);
            TerminalServer::ip_comp_map_type::const_iterator end_iter = TerminalServer::get()->GetIpCompMap().end();
            if (iter == end_iter)
                throw exception ("Client's computer number is not present in ip_num.ini");
            DWORD compnum = iter->second;
// Теперь в compnum лежит номер клиентского компьютера


Формат файла ip_num.ini. Каждый элемент соответствия IP->номер компьютера представлен отдельной строкой. Формат строки - XXX.XXX.XXX.XXX=NNN, где иксы - IP-адрес, NNN - номер компьютера.

переменная ip_comp_map типа TerminalServer::ip_comp_map_type.
TerminalServer::ip_comp_map_type - это typedef std::map<ULONG, DWORD>.
1.9K
14 ноября 2007 года
max_dark
256 / / 11.11.2005
Какая разметка у файла?
IP_ПРОБЕЛ_КЛЮЧ ?
28K
14 ноября 2007 года
getch()
18 / / 11.11.2007
max_dark, разметка ну например йпи_кей, еще не определился с ней сейчас на любую согласен.
cheburator, еще раз пасибо.
28K
14 ноября 2007 года
getch()
18 / / 11.11.2007
cheburator, не могу отладить ваш код, ошибочки не понимаю...
подключил <fstream>, что есчо надо?
мой
Код:
#include <winsock.h>
#include <conio.h>
#include <fstream>
#include <stdio.h>
#include <map>
#include <string>
using namespace std;
#pragma comment (lib, "ws2_32.lib")
#pragma comment (lib, "mswsock.lib")
#pragma comment(lib,"wsock32.lib")

void main()
{
    char PCName [30], ClientName[30];
    typedef map<ULONG, DWORD> ip_comp_map_type;
    ip_comp_map_type ip_comp_map;
    WSAData WSADat; // Свойства WinSock (результат функции WSAStartup)
    sockaddr_in sin; // Свойства(адрес) создаваемого сокета
    sockaddr_in sa;
    SOCKET Sock, Client; // Серверный и клиентский сокеты
    // ЗАГРУЗИМ СООТВЕТСТВИЯ IP-АДРЕСОВ КЛИЕНТОВ И НОМЕРОВ КОМПЬЮТЕРОВ
    ifstream file ("ip_num.txt");
        string str;
        while (!file.eof())
        {
            file >> str;
            // Найдем знак =
            size_t offset = str.find ('=');
            if (offset == string::npos)
                throw exception ("Wrong config.ini format");
            ULONG ip = inet_addr (str.substr (0, offset).c_str());
            DWORD comp = (DWORD) atoi (str.substr (offset+1).c_str());
            ip_comp_map.insert (pair<ULONG,DWORD>(ip, comp));
        };

    WSAStartup(0x0202,&WSADat); // Инициализация WinSock
                                // 0x0202 - версия WinSock. Может быть 1.0, 1.1, 2.0, 2.2
                                // WSADat - структура, куда будут занесены рез. инициализации
    gethostname(PCName, 30); // Получение имени текущего ПК

    sin.sin_family = AF_INET; // Тип адреса
    sin.sin_addr.s_addr = 0;  // IP-адрес сервера (пори создании сервера можно 0)
    sa.sin_addr.s_addr = 0;
    sin.sin_port = htons(2803); // Номер порта сервера
    Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Создание сокета
    bind(Sock, (sockaddr*)&sin, sizeof(sin)); // Связывание созданного сокета с адресом sin

    // ***** Ожиданеи клиента
    cout << "Wait of client..." << endl;
   
    listen(Sock, SOMAXCONN); // Прослушивание сокета сервером (для подключения клиента)
    Client = accept(Sock, (sockaddr*)&sin, 0); // Ожидание клиента
    recv(Client, ClientName, 30, 0); // Получение имени компьютера клиента
    send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера)
   
    int namelen = sizeof(sa);
    if (::getpeername (Client, (SOCKADDR*)&sa, &namelen) != 0)
        throw exception ("Can't define client's ip address");
    cout << "Client ( " << ClientName << " ) has connected!" << endl;
    cout << inet_ntoa(sa.sin_addr) << endl;

            // Определить номер компутера.
            ip_comp_map_type::const_iterator iter = ip_comp_map.find (sa.sin_addr.s_addr);
            ip_comp_map_type::const_iterator end_iter = ip_comp_map.end();
            if (iter == end_iter)
                throw exception ("Client's computer number is not present in ip_num.txt");
            DWORD compnum = iter->second;
// Теперь в compnum лежит номер клиентского компьютера

    getch();
    closesocket(Sock);
    closesocket(Client);
    WSACleanup();
}
350
14 ноября 2007 года
cheburator
589 / / 01.06.2006
file >> str; // НЕПОНЯЛ ЧТО ТАКОЕ?????
Чтение строки из файла
350
14 ноября 2007 года
cheburator
589 / / 01.06.2006
Ладно. Вот поправки к твоему коду.
1. Подключи #include <map> и <string>
2.
 
Код:
// Используем пространство имен std
using namespace std;
void main ()
{
// Нужно объявить соответствие ip<->номер
typedef map<ULONG, DWORD> ip_comp_map_type;
ip_comp_map_type ip_comp_map;

3. Меняем определение номера компутера
 
Код:
// Определить номер компутера.

ip_comp_map_type::const_iterator iter = ip_comp_map.find (sa.sin_addr.s_addr);
ip_comp_map_type::const_iterator end_iter = ip_comp_map.end();
if (iter == end_iter)
throw exception ("Client's computer number is not present in ip_num.txt");
DWORD compnum = iter->second;


Если будут вылезать ошибки компиляции, пиши конкретно текст ошибок.
28K
14 ноября 2007 года
getch()
18 / / 11.11.2007
с библиотеками разобрался а за переменные фенкс, до утра бы завяз... вот оставшиеся ошибочки:
LINK : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
LINK : fatal error LNK1201: error writing to program database 'd:\Documents and Settings\boss.1D4A8EB762AB40D\Рабочий стол\Socket\SocketServer\Debug\SocketServer.pdb'; check for insufficient disk space, invalid path, or insufficient privilege
код потправил.
350
15 ноября 2007 года
cheburator
589 / / 01.06.2006
Первое - предупреждение, не ошибка, можешь не обращать внимания.
Второе - либо не хватает места на диске, либо попробуй сделать полный ребилд.
28K
15 ноября 2007 года
getch()
18 / / 11.11.2007
создал новый проект, вставил в него этот код, прежних 2х ошибок нет но все равно не работает:
First-chance exception at 0x7c81eb33 in soket2.exe: Microsoft C++ exception: exception @ 0x0012f9c8.
Unhandled exception at 0x7c81eb33 in soket2.exe: Microsoft C++ exception: exception @ 0x0012f9c8.
The program '[3276] soket2.exe: Native' has exited with code 0 (0x0).
Думаю надо специалисту запустить соствено и лично посмотреть...
При создании нового проекта проскакивала ошибка-не ожиданный конец файла....., но потом и она исчезла. из этого тупика сам не выбирусь, help...
28K
15 ноября 2007 года
getch()
18 / / 11.11.2007
делал rebuild и clean solution к ошибке о нехватки места прибавилась такая:
d:\documents and settings\boss.1d4a8eb762ab40d\мои документы\visual studio projects\soket2\soket2.cpp(60) : warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data
которая ссылается сюда:
 
Код:
send(Client, PCName, strlen(PCName) + 1, 0); // Отправка имени этого компьютера (сервера)
350
15 ноября 2007 года
cheburator
589 / / 01.06.2006
Модифицировал твой код.
Лежит во вложении.
28K
15 ноября 2007 года
getch()
18 / / 11.11.2007
cheburator, благодарю за помощь, пасибо бальшое все работает, а старая версия заработала на др. машине без всяких доработок....
с посылкой ключа серверу справлюсь, а с записью ответа клиента\времени\йпи в файл лог.тхт не уверен, как бы мне есчо это организовать? какие функции потребуюся?
350
16 ноября 2007 года
cheburator
589 / / 01.06.2006
Потребуется объявить файл и выполнить туда запись.
Вот пример, где выводится IP и текущее время.
 
Код:
ofstream log ("log.txt");
time_t current_time;
time (&current_time);
log << "Client IP " << inet_ntoa (sa.sin_addr) << ", " << ctime (&current_time);

Нужно подключить <time.h>.
Время выводится в UTC (т. е. по гринвичу) в виде "Wed Jan 02 02:03:55 1980\n\0".
Если нужен другой формат, используй функцию localtime, она вернет структуру, содержащую год, месяц, день и т. п.
28K
16 ноября 2007 года
getch()
18 / / 11.11.2007
cheburator, фенкс тебе за помощь, очень помог... осталось разораться теперь что да как работает для препода.
нюансик только один получился, лог файл каждый запуск сервера заново создается и в итоге там всегда одна запись, хотелось бы знать как сделать чтобы каждый раз строка записывалась.
350
17 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: getch()
лог файл каждый запуск сервера заново создается и в итоге там всегда одна запись, хотелось бы знать как сделать чтобы каждый раз строка записывалась.


Вместо

 
Код:
ofstream log ("log.txt");

попробуем написать
 
Код:
ofstream log ("log.txt", ios_base::out | ios_base::app);

Тогда файл будет открываться в режиме добавления (т. е. в момент открытия файла существующее содержимое не затрется, а операции записи по умолчанию будут дописывать в конец).
28K
17 ноября 2007 года
getch()
18 / / 11.11.2007
пасибо за подсказку cheburator, все отлично работает.
50K
15 января 2010 года
iCrash
30 / / 12.01.2010
а это написано под winodws?
10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Цитата: iCrash
а это написано под winodws?



Ну судя по этим сторочкам

Цитата:

#include <winsock.h>
и
WSAData WSADat;
WSAStartup(0x0202,&WSADat);


Видимо под Windows
А что?)

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
просто мне нужно все тоже самое, но токо под linux :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог