Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP/IP компоненты, сеть, клиент_сервер 
:(
    Опции темы
rthsobakas
Дата 12.2.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



Возможно тема не в тему, так как есть отдельная тема по СЕТИ. Но меня интересует конкретно билдер... Вообщем ситуация такая. Нужно написать прогу типо чата( клиент\ сервер) и осуществить обмен фаилами(реализовать). Есть ли в какой нить вкладке политра компонентов, компонент работающий с ТЦП ИП? С чего вообще начать создание такой проги? Есть может примеры у кого?
Читаю Йон Снейдер - Эффективное программирование TCP-IP(то есть к нему посылать не надо меня)...и в гугл тоже))
Просто поделитесь опытом работы с тцп ип компонентами из палитры если они есть.
 
PM   Вверх
Dmi3ev
Дата 13.2.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Цитата

Есть ли в какой нить вкладке политра компонентов, компонент работающий с ТЦП ИП?

Учу работать с C++Builder.
Допустим я не знаю компонент ваще, ваще ничего не знаю, тогда:
1) в главном меню окна находишь View
2) потом во View находишь Component List
3) компоненты начинаются с T (обычно), поэтому ты вводишь T, затем вводишь TCP (ты же этого хотел), те в строке должно быть TTCP и, о чудо, он сам подсветил тебе компонент...
А если знать еще, что есть и TIDTCP (компоненты INDY), то можно и это ввести... он сам тебе найдет))) круто? да?
А после того как он это все находит, можно еще и разобраться где это такое есть? на каких вкладках...
4) осталось дело за малым, научиться пользоваться поиском на форуме, даю 100%, что здесь есть примеры обмена данными по сети, причем, как через компоненты, так и программно, а если гуглом воспользоваться, то ваще чума будет, там можно найти примеры, которые передают на другой комп изображение с веб-камеры и многое другое...

Это сообщение отредактировал(а) Dmi3ev - 13.2.2009, 12:30


--------------------

PM MAIL   Вверх
mrbrooks
Дата 14.2.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(rthsobakas @  12.2.2009,  22:02 Найти цитируемый пост)
Есть ли в какой нить вкладке политра компонентов, компонент работающий с ТЦП ИП?

да их уйму - только мой совет - компоненты не айс. Начни изучать все это дело с голых, добрых, старых сокетов smile 
PM MAIL   Вверх
Mpak
Дата 14.2.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rthsobakas, может пригодиться в твоих начинаниях. Вот не плохой примерчик под 6 билдер из книги Шамуса "С++ Builder Broland Developer Studio 2006".


Присоединённый файл ( Кол-во скачиваний: 83 )
Присоединённый файл  TCP.IP.rar 404,72 Kb


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
rthsobakas
Дата 14.2.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



mrbrooks, читаю Йон Снейдер - Эффективное программирование TCP-IP . Там как раз про сокеты. Тока там для Юникс, но под винду переделать можно легко, разница в обозначениях.


Mpak, ага сспасибо. посмотрю.
PM   Вверх
rthsobakas
Дата 22.2.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



Dmi3ev,  я использую 2009 builer c++ , по крайней мере там в view нет component list, и в турбо эксплоере с++ тоже не было кстати.

Нашел http://www.realcoding.net/article/view/4341
там

В c++builder 6 для передачи какой-либо информации по сети удобнее всего использовать компоненты закладки internet: tclientsocket и tserversocket. Чтобы лучше разобраться в работе этих компонентов я предлагаю написать простенький сетевой чат, на примере которого можно будет легко увидеть компоненты в действии.

В 2009 билдере назакладке ИНТЕРНЕТ нету tcpclientsocket u tcpserversocket!
Там есть что то похожее на них так это разве что TCPclient TCPserver. Плохо то что эти компоненты не те явно. Это видно из СОБЫТИЙ(event) . Некоторых пунктов нет. Например onconnect у тцпклиента.
+
Нету tcpserver1->socket->...
то есть чат е реально посторить из за недостатка информации.
Может tcpclientsocket u tcpserversocket в другой вкладке ? 
блин нафига с изменение версии билдера менять все. запарили.

Добавлено через 5 минут и 49 секунд
вот фаил

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  ___.rar 21,72 Kb
PM   Вверх
rthsobakas
Дата 22.2.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



блин капец... серверсокет и клиентсокет оказывается дополнительно устанавливать надо было(нашел на каком то форуме).

Вообщем чат написал вроде, но проблемы скодировкой появились.
На клиенте пишу
текст
rthsobakas:: Hello world!
на сервере получаю
瑲獨扯歡獡㨺效汬潷汲Ⅴ
Че за японский перевод? ТИпо че то с кодировкой сделать надо я полагаю! что? подскажите
PM   Вверх
SVN74
Дата 22.2.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(rthsobakas @  22.2.2009,  15:03 Найти цитируемый пост)
rthsobakas:: Hello world!
на сервере получаю
瑲獨扯歡獡㨺效汬潷汲Ⅴ
Че за японский перевод? ТИпо че то с кодировкой сделать надо я полагаю! что? подскажите 


L"Hello world!"

PM MAIL WWW   Вверх
rthsobakas
Дата 22.2.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



SVN74, Что?

Я кажись понял в чем проблема, подскажите как
UnicodeString
конвертировать в Ansistring
PM   Вверх
SVN74
Дата 22.2.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(rthsobakas @  22.2.2009,  19:49 Найти цитируемый пост)
Я кажись понял в чем проблема, подскажите какUnicodeStringконвертировать в Ansistring


Ну вообще то в C++ Builder 2009 не принято использовать AnsiString, оно используется только для совместимости, но раз уж пришлось 
использовать AnsiString, то и конвертацию предусмотрели...

Код

AnsiString Astr = "Привет, это я";
   UnicodeString Ustr;
                 Ustr = UnicodeString(Astr);
                 Memo1->Text = Ustr;


Можно также без явной конвертации...

Код

AnsiString Astr = "Привет, это я";
   UnicodeString Ustr;
                 Ustr = Astr;
                 Memo1->Text = Ustr;
   // Вот обратно
     Astr = Ustr;
     Memo1->Text = Astr;



А при присвоении кода надо так...
 UnicodeString Ustr = L"Привет, это я";


Это сообщение отредактировал(а) SVN74 - 22.2.2009, 22:25
PM MAIL WWW   Вверх
rthsobakas
Дата 23.2.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



SVN74, 
это кнопка отправить
в Едит2-ник
в Едит1-текст сообщения

Код

void __fastcall TForm2::Button1Click(TObject *Sender)
{
if(Edit2->Text==""){
ShowMessage("Введите ваш ник");
return;
}
if(Edit1->Text==""){
ShowMessage("Введите текст для отправки");
return;
}
Memo1->Lines->Add(Edit2->Text +":: "+Edit1->Text);
if (ServerSocket1->Active ==true)
  ServerSocket1->Socket->Connections[0]->SendText((Edit2->Text+"::"+Edit1->Text));
else
  ClientSocket1->Socket->SendText((Edit2->Text+"::"+Edit1->Text));
  Edit1->Text="";
}


Цитата

А при присвоении кода надо так...
 UnicodeString Ustr = L"Привет, это я";

То есть ->SendText((Edit2->Text+"::"+Edit1->Text)); заменить на ->SendText(L(Edit2->Text+"::"+Edit1->Text));

Я правильно понял?
PM   Вверх
SVN74
Дата 23.2.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(rthsobakas @  23.2.2009,  09:58 Найти цитируемый пост)
Я правильно понял?

Нет, нет...
Если это пишется под C++ Builder 2009, то все его компоненты уже несут в себе формат UnicodeString...
Вот маленький примерчик (примерно) пересылки сообщений в Indy 10.

Код

void __fastcall TForm1::IdTCPClient1Connected(TObject *Sender)
{
     IdTCPClient1->IOHandler->WriteLn(Edit1->Text);

}
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
   Edit1->Text = AContext->Connection->IOHandler->ReadLn();
}


А вообще то лучше использовать   <WinSock2.h>


Код


  // Пример простого TCP – эхо сервера

  #include <stdio.h>
  #include <winsock2.h>  // Wincosk2.h должен быть 
          // подключен раньше windows.h!
  #include <windows.h>

  #define MY_PORT    666
           // Порт, который слушает сервер

  // макрос для печати количества активных
  // пользователей 
  #define PRINTNUSERS if (nclients)\
  printf("%d user on-line\n",nclients);\
  else printf("No User on line\n");

  // прототип функции, обслуживающий
  // подключившихся пользователей
  DWORD WINAPI SexToClient(LPVOID client_socket);

  // глобальная переменная – количество
  // активных пользователей 
  int nclients = 0;

  int main(int argc, char* argv[])
  {
    char buff[1024];    // Буфер для различных нужд

    printf("TCP SERVER DEMO\n");

    // Шаг 1 - Инициализация Библиотеки Сокетов
    // Т.к. возвращенная функцией информация
    // не используется ей передается указатель на
    // рабочий буфер, преобразуемый
    // к указателю  на структуру WSADATA.
    // Такой прием позволяет сэкономить одну
    // переменную, однако, буфер должен быть не менее
    // полкилобайта размером (структура WSADATA
    // занимает 400 байт)
    if (WSAStartup(0x0202,(WSADATA *) &buff[0])) 
    {
      // Ошибка!
          printf("Error WSAStartup %d\n",
             WSAGetLastError());
      return -1;
    }

    // Шаг 2 - создание сокета
    SOCKET mysocket;
    // AF_INET     - сокет Интернета
    // SOCK_STREAM  - потоковый сокет (с
    //      установкой соединения)
    // 0      - по умолчанию выбирается TCP протокол
    if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0)
    {
      // Ошибка!
      printf("Error socket %d\n",WSAGetLastError());
      WSACleanup();
        // Деиницилизация библиотеки Winsock
      return -1;
    }

    // Шаг 3 связывание сокета с локальным адресом
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(MY_PORT);
             // не забываем о сетевом порядке!!!
    local_addr.sin_addr.s_addr=0;
             // сервер принимает подключения
             // на все IP-адреса

    // вызываем bind для связывания
    if (bind(mysocket,(sockaddr *) &local_addr,
                sizeof(local_addr)))
    {
      // Ошибка
      printf("Error bind %d\n",WSAGetLastError());
      closesocket(mysocket;  // закрываем сокет!
      WSACleanup();
      return -1;
    }

    // Шаг 4 ожидание подключений
    // размер очереди – 0x100
    if (listen(mysocket, 0x100))
    {
      // Ошибка
      printf("Error listen %d\n",WSAGetLastError());
      closesocket(mysocket);
      WSACleanup();
      return -1;
    }

    printf("Ожидание подключений\n");

    // Шаг 5 извлекаем сообщение из очереди
    SOCKET client_socket;    // сокет для клиента
    sockaddr_in client_addr;    // адрес клиента
              // (заполняется системой)

    // функции accept необходимо передать размер
    // структуры
    int client_addr_size=sizeof(client_addr);

    // цикл извлечения запросов на подключение из
    // очереди
    while((client_socket=accept(mysocket, (sockaddr *)
            &client_addr, &client_addr_size)))
    {
      nclients++;      // увеличиваем счетчик
              // подключившихся клиентов

      // пытаемся получить имя хоста
      HOSTENT *hst;
      hst=gethostbyaddr((char *)
          &client_addr.sin_addr.s_addr,4, AF_INET);

      // вывод сведений о клиенте
      printf("+%s [%s] new connect!\n",
      (hst)?hst->h_name:"",
      inet_ntoa(client_addr.sin_addr));
      PRINTNUSERS

      // Вызов нового потока для обслужвания клиента
      // Да, для этого рекомендуется использовать
      // _beginthreadex но, поскольку никаких вызов
      // функций стандартной Си библиотеки поток не
      // делает, можно обойтись и CreateThread
      DWORD thID;
      CreateThread(NULL,NULL,SexToClient,
              &client_socket,NULL,&thID);
    }
    return 0;
  }

  // Эта функция создается в отдельном потоке и
  // обсуживает очередного подключившегося клиента
  // независимо от остальных
  DWORD WINAPI SexToClient(LPVOID client_socket)
  {
    SOCKET my_sock;
    my_sock=((SOCKET *) client_socket)[0];
    char buff[20*1024];
    #define sHELLO "Hello, Sailor\r\n"

    // отправляем клиенту приветствие 
    send(my_sock,sHELLO,sizeof(sHELLO),0);

    // цикл эхо-сервера: прием строки от клиента и
    // возвращение ее клиенту
    while( (int bytes_recv=
                 recv(my_sock,&buff[0],sizeof(buff),0))
              && bytes_recv !=SOCKET_ERROR)
      send(my_sock,&buff[0],bytes_recv,0);

    // если мы здесь, то произошел выход из цикла по
    // причине возращения функцией recv ошибки –
    // соединение клиентом разорвано
    nclients--; // уменьшаем счетчик активных клиентов
    printf("-disconnect\n"); PRINTNUSERS

    // закрываем сокет
    closesocket(my_sock);
    return 0;
  }

Листинг 34 Пример реализации TCP эхо-сервера 

Пример реализации TCP-клиента
  // Пример простого TCP клиента
  #include <stdio.h>
  #include <string.h>
  #include <winsock2.h>
  #include <windows.h>


  #define PORT 666
  #define SERVERADDR "127.0.0.1"

  int main(int argc, char* argv[])
  {
    char buff[1024];
    printf("TCP DEMO CLIENT\n");

    // Шаг 1 - инициализация библиотеки Winsock
    if (WSAStartup(0x202,(WSADATA *)&buff[0]))
    {
      printf("WSAStart error %d\n",WSAGetLastError());
      return -1;
    }

    // Шаг 2 - создание сокета
    SOCKET my_sock;
    my_sock=socket(AF_INET,SOCK_STREAM,0);
    if (my_sock < 0)
    {
      printf("Socket() error %d\n",WSAGetLastError());
      return -1;
    }

    // Шаг 3 - установка соединения

    // заполнение структуры sockaddr_in
    // указание адреса и порта сервера
    sockaddr_in dest_addr;
    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);
    HOSTENT *hst;

    // преобразование IP адреса из символьного в
    // сетевой формат
    if (inet_addr(SERVERADDR)!=INADDR_NONE)
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      // попытка получить IP адрес по доменному
      // имени сервера
      if (hst=gethostbyname(SERVERADDR))
      // hst->h_addr_list содержит не массив адресов,
      // а массив указателей на адреса
      ((unsigned long *)&dest_addr.sin_addr)[0]=
        ((unsigned long **)hst->h_addr_list)[0][0];
      else 
      {
        printf("Invalid address %s\n",SERVERADDR);
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }

    // адрес сервера получен – пытаемся установить
    // соединение 
    if (connect(my_sock,(sockaddr *)&dest_addr,
                sizeof(dest_addr)))
    {
      printf("Connect error %d\n",WSAGetLastError());
      return -1;
    }

    printf("Соединение с %s успешно установлено\n\
    Type quit for quit\n\n",SERVERADDR);

    // Шаг 4 - чтение и передача сообщений
    int nsize;
    while((nsize=recv(my_sock,&buff[0],
                      sizeof(buff)-1,0))
                  !=SOCKET_ERROR)
    {
      // ставим завершающий ноль в конце строки 
      buff[nsize]=0;

      // выводим на экран 
      printf("S=>C:%s",buff);

      // читаем пользовательский ввод с клавиатуры
      printf("S<=C:"); fgets(&buff[0],sizeof(buff)-1,
             stdin);

      // проверка на "quit"
      if (!strcmp(&buff[0],"quit\n"))
      {
        // Корректный выход
        printf("Exit...");
        closesocket(my_sock);
        WSACleanup();
        return 0;
      }

      // передаем строку клиента серверу
      send(my_sock,&buff[0],nsize,0);
    }

    printf("Recv error %d\n",WSAGetLastError());
    closesocket(my_sock);
    WSACleanup();
    return -1;
  }




http://www.citforum.ru/book/cook/winsock.shtml
PM MAIL WWW   Вверх
rthsobakas
Дата 28.2.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

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



SVN74, 
Цитата

Нет, нет...
Если это пишется под C++ Builder 2009, то все его компоненты уже несут в себе формат UnicodeString...


А что сделать чтобы при компиляции не юникод был, а стандарнтый асни??? Может в опциях где то?
Или каждый раз конвертировать?
PM   Вверх
SVN74
Дата 28.2.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(rthsobakas @  28.2.2009,  21:35 Найти цитируемый пост)
А что сделать чтобы при компиляции не юникод был, а стандарнтый асни??? Может в опциях где то?
Или каждый раз конвертировать? 

Unicode необходим для совмещения языков в разных стандартах стран и BCB 2009 полностью переведен на данный стандарт, поэтому придется перестраиваться полностью на Unicode, Ansi поддерживается только для совместимости...
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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