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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка по tcp для начинающего 
:(
    Опции темы
feodorv
Дата 6.8.2014, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nullpoint @  2.8.2014,  13:16 Найти цитируемый пост)
Можете показать как это реализовать без записи в БД? 

Гм. Я не работаю с QtCreator, поэтому тупые BSD сокеты. 


Цитата(nullpoint @  2.8.2014,  13:16 Найти цитируемый пост)
Т.е. сгенерировали ключ, отобразили его на экран в ASCII, приняли от клиента сообщение, посмотрели по базе идентификатор, отправили клиенту сообщение или вывели сообщение об ошибке, если нет такого идентификатора. 

Только сетевой обмен, остальное сами  smile 


Клиент
Код

#include <stdio.h>

#define PORT 20000

int readData( int socket, unsigned char *buf, int len)
{
  int length = 0, i;

  while( length < len )
  {
    int n = recv( socket, &buf[length], len-length, 0);
    if( n == 0 ) // соединение закрыто
    {
      printf( "  *** Connection closed by client\n" );
      return 0;
    }
    if( n < 0 ) // произошла ошибка
    {
      printf( "  *** Recv error\n" );
      return -1;
    }
    length += n;
  }

  printf( "  *** Got data(%d):", length);
  for( i = 0; i < length; i++)
    printf( "%s%02x", (i == 0) ? " " : ".", buf[i]);
  printf( "\n" );

  return length;
}

void doAction( int s )
{
  unsigned char query[5], message[15];

  query[0] = 0x45u;
  query[1] = 'A';
  query[2] = 'B';
  query[3] = 'C';
  query[4] = '\0';

  if( send( s, query, 5, 0) < 0 )
  {
    printf( "Can't send query\n" );
    return;
  }

  if( readData( s, message, 15) <= 0 ) return;

  printf( "OK\n" );
}

int client( void )
{
  struct sockaddr_in addr;
  int s;

  if( (s = socket( AF_INET, SOCK_STREAM, 0)) < 0 )
  {
    printf( "Can't open client socket\n" );
    return -1;
  }

  memset( &addr, '\0', sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl( INADDR_LOOPBACK );
  addr.sin_port = htons( PORT );
  if( connect( s, (struct sockaddr *) &addr, sizeof(addr)) < 0 )
  {
    printf( "Can't connect client socket\n" );
    close( s );
  }

  doAction( s );

  close( s );
  return 0;
}



Сервер
Код

#include <stdio.h>

#define PORT 20000

int readData( int socket, unsigned char *buf, int len)
{
  int length = 0, i;

  while( length < len )
  {
    int n = recv( socket, &buf[length], len-length, 0);
    if( n == 0 ) // соединение закрыто
    {
      printf( "  *** Connection closed by client\n" );
      return 0;
    }
    if( n < 0 ) // произошла ошибка
    {
      printf( "  *** Recv error\n" );
      return -1;
    }
    length += n;
  }

  printf( "  *** Got data:" );
  for( i = 0; i < length; i++)
    printf( "%s%02x", (i == 0) ? " " : ".",  buf[i]);
  printf( "\n" );

  return length;
}

void doAction( int s, struct sockaddr_in *sa)
{
  unsigned int ip = ntohl( sa->sin_addr.s_addr );
  unsigned int port = ntohs( sa->sin_port );
  unsigned char query[5];
  int len;

  printf( "Got connection from %.2u.%.2u.%.2u.%.2u:%u\n",
    (ip >> 24) & 0xffu, (ip >> 16) & 0xffu, (ip >> 8) & 0xffu, ip & 0xffu, port);

  if( (len = readData( s, query, 5)) <= 0 )
  {
    close( s );
    return;
  }

  if( query[4] != '\0' )
  {
    printf( "Invalid client data\n" );
    close( s );
    return;
  }

  printf( "  >>> Command = %x\n", query[0]);
  printf( "  >>> Client id = %s\n", &query[1]);

  if( query[0] == 0x45u )
  {
    unsigned char message[15];
    message[0] = 0x45u;
    message[1] = 0x42u;
    message[2] = query[1];
    message[3] = query[2];
    message[4] = query[3];
    message[5] = '\0';
    message[6] = 1;
    message[7] = 2;
    message[8] = 3;
    message[9] = 4;
    message[10] = 5;
    message[11] = 6;
    message[12] = 7;
    message[13] = 8;
    message[14] = 9;
    if( send( s, message, 15, 0) < 0 )
      printf( "  --- Error of send\n" );
    else
    {
      unsigned char data[1];
      shutdown( s, SD_SEND);
      // ждем подтверждения от клиента, что ответ принят
      if( readData( s, data, 1) < 0 )
      {
        // client error;
      }
    }
  }

  close( s );
}

int server( void )
{
  struct sockaddr_in addr;
  int ss;

  if( (ss = socket( AF_INET, SOCK_STREAM, 0)) < 0 )
  {
    printf( "Can't open server socket\n" );
    return -1;
  }

  memset( &addr, '\0', sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl( INADDR_ANY );
  addr.sin_port = htons( PORT );
  if( bind( ss, (struct sockaddr *) &addr, sizeof(addr)) < 0 )
  {
    printf( "Can't bind server socket\n" );
    close( ss );
    return -1;
  }

  if( listen( ss, 5) < 0 )
  {
    printf( "Can't listen server socket\n" );
    close( ss );
    return -1;
  }

  for( ;; )
  {
    int alen = sizeof(addr);
    int s = accept( ss, (struct sockaddr *) &addr, &alen);

    if( s < 0 )
    {
      printf( "Can't connect server socket\n" );
      close( ss );
      return -1;
    }

    doAction( s, &addr);
  }

  return 0;
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
nullpoint
Дата 7.8.2014, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



feodorv, спасибо, уже сам разобрался, но с помощью вашего кода подправил свое приложение smile
PM MAIL   Вверх
feodorv
Дата 7.8.2014, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(nullpoint @  7.8.2014,  22:25 Найти цитируемый пост)
уже сам разобрался

 smile 


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


 




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


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

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