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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [UDP] Передача файла с помощью сокетов 
V
    Опции темы
alexuni
  Дата 17.10.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



    Пишу лабу по сокетам. Полностью задание звучит так: Файл передается блоками размером в 1 КБ. В   запросе   указывается   полный   путь   к файлу   и   номер   блока.   Для   поиска доступных   серверов   используется широковещательная рассылка. Тип сервера: последовательный.
    У меня возникла проблема с передачей файла блоками и заданием в запросе конкретного номера блока...
Собственно реализация... Буду рад любой помощи (желательно с кодом ))))

Код Сервера
Цитата

#include <stdio.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")

  #define PORT 666    // порт сервера

  int main(int argc, char* argv[])
  {
    char buff[1024];

    printf("Server start working...\n");

    //подключение библиотеки 
    if (WSAStartup(0x202,(WSADATA *) &buff[0]))
    {
      printf("WSAStartup error: %d\n",
             WSAGetLastError());
      return -1;
    }

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

    //связывание сокета с локальным адресом 
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=INADDR_ANY;
    local_addr.sin_port=htons(PORT);

    if (bind(my_sock,(sockaddr *) &local_addr,
        sizeof(local_addr)))
    {
      printf("bind error: %d\n",WSAGetLastError());
      closesocket(my_sock);
      WSACleanup();
      return -1;
    }

    //обработка пакетов, присланных клиентами
    while(1)
    {
      sockaddr_in client_addr;
      int client_addr_size = sizeof(client_addr);
      int bsize=recvfrom(my_sock,&buff[0],
        sizeof(buff)-1,0,
        (sockaddr *) &client_addr, &client_addr_size);
      if (bsize==SOCKET_ERROR)
      printf("recvfrom() error: %d\n",
             WSAGetLastError());

      // Определяем IP-адрес клиента и прочие атрибуты
      HOSTENT *hst;
      hst=gethostbyaddr((char *)
            &client_addr.sin_addr,4,AF_INET);
      printf("+%s [%s:%d] new DATAGRAM!\n",
      (hst)?hst->h_name:"Unknown host",
      inet_ntoa(client_addr.sin_addr),
      ntohs(client_addr.sin_port));

      // добавление завершающего нуля
      buff[bsize]=0;

      // Вывод на экран 
      printf("Client=>Server:%s\n",&buff[0]);

  FILE *file;
       char* file_name = buff;
    file_name[strlen(file_name) - 1] = '\0';

          file = fopen( file_name, "r" );
          if( file != 0 )
            {
     fgets( buff, sizeof(buff) , file );
            }
          else
            {
      printf("File not found !!!");
            }
     fclose(file);

      // посылка датаграммы клиенту
      sendto(my_sock,&buff[0],strlen(&buff[0]),0,
        (sockaddr *)&client_addr, sizeof(client_addr));
    }
    return 0;
  }


Код клиента:
Цитата

#include <stdio.h>
#include <string.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>

   #pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
   #pragma comment (lib, "mswsock.lib")

  #define PORT 666
  #define SERVERADDR "127.0.0.1"
  #define CLIENT_FILE "example.txt" //файл на клиенте

  int main(int argc, char* argv[])
  {
    char buff[10*1014];
    printf("Client stert working...\n");

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

    //открытие сокета
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
    if (my_sock==INVALID_SOCKET)
    {
      printf("socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }

    //обмен сообщений с сервером
    // установка возможности широковещательного адреса
    int i = 1;
    if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
    {
  printf ("Error setting broadcast socket\n");
  WSACleanup();
  return -1;
    }
    HOSTENT *hst;
    sockaddr_in dest_addr;

    dest_addr.sin_family=AF_INET;
    dest_addr.sin_port=htons(PORT);

    
    // определение IP-адреса узла
    if (inet_addr(SERVERADDR))
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    else
      if (hst=gethostbyname(SERVERADDR))
        dest_addr.sin_addr.s_addr=((unsigned long **)
              hst->h_addr_list)[0][0];
    else
      {
        printf("Unknown host: %d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }
     

    while(1)
    {
      // чтение сообщения с клавиатуры
      printf("\nClient=>Server:");fgets(&buff[0],sizeof(buff)-1,
             stdin);
      if (!strcmp(&buff[0],"quit\n")) break;

      // Передача сообщений на сервер
      sendto(my_sock,&buff[0],strlen(&buff[0]),0,
        (sockaddr *) &dest_addr,sizeof(dest_addr));

      // Прием сообщения с сервера
      sockaddr_in server_addr;
      int server_addr_size=sizeof(server_addr);

      int n=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0,
        (sockaddr *) &server_addr, &server_addr_size);

      if (n==SOCKET_ERROR)
      {
        printf("recvfrom() error:"\
          "%d\n",WSAGetLastError());
        closesocket(my_sock);
        WSACleanup();
        return -1;
      }

      buff[n]=0;

      // Вывод принятого с сервера содержимого файла на экран
      printf("Client<=Server:%s",&buff[0]);

   FILE *file;
       char* file_name = CLIENT_FILE;
        file = fopen( file_name, "w" ); 
        fputs(buff, file );
        fclose( file );
    }

    //выход
    closesocket(my_sock);
    WSACleanup();

    return 0;
  }


PM MAIL   Вверх
DrHex
Дата 18.10.2009, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В чем проблема??
Если ты не знаеш соктов то почитай об них. Ну а если не получается сделать лабу то тебе в центр помощи...
--------------------
google.com и это все.
PM MAIL   Вверх
alexuni
  Дата 24.10.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Переделал и оптимизировал свою лабу: теперь файл передается блоками. Но осталась небольшая загвоздка: как задать в запросе конкретный номер блока, а на принимающей стороне правильно его интерпретировать и отыскать? Рассчитываю, что на данном форуме все же получу компетентную помощь...

Код клиента:
Код

#include <stdio.h>
#include <string.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>

#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")

#define PORT 15150
#define SERVERADDR "127.0.0.1"
#define CLIENT_FILE "example.txt" //файл на клиенте
#define Line "File is recivied"
int p;

#define Nsize 1024
int main(int argc, char* argv[])
{
char buffer[30*Nsize];
char buff[Nsize + 1];
printf("Client stert working...\n");

//иницилизация библиотеки Winsocks
WSADATA WsaData;
if( WSAStartup(0x0202, &WsaData) )
{
printf("Winsock cannot be started\r\n");
return false;
}

//открытие сокета
SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
if (my_sock==INVALID_SOCKET)
{
printf("socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}

//обмен сообщений с сервером
// установка возможности широковещательного адреса
int i = 1;
if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
{
printf ("Error setting broadcast socket\n");
WSACleanup();
return -1;
}
HOSTENT *hst;
sockaddr_in dest_addr;
memset(&dest_addr, 0, sizeof(sockaddr_in));
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);


// определение IP-адреса узла
if (inet_addr(SERVERADDR))
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
if (hst=gethostbyname(SERVERADDR))
dest_addr.sin_addr.s_addr=((unsigned long **)
hst->h_addr_list)[0][0];
else
{
printf("Unknown host: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}


while(1)
{
// чтение сообщения с клавиатуры
printf("\nClient=>Server:");
scanf("%s", buff);
//fgets(&buff[0],sizeof(buff)-1, stdin);
if (!strcmp(buff,"quit\n")) break;

// Передача сообщений на сервер
sendto(my_sock, buff, strlen(buff), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in));

// Прием сообщения с сервера
sockaddr_in server_addr;
int server_addr_size=sizeof(server_addr);
char* line = Line;
p = 0;

while(*buff!=*line)
//do
{
memset(buff, 0, Nsize);
int n=recvfrom(my_sock,&buff[0],Nsize + 1,0,
(sockaddr *) &server_addr, &server_addr_size);

printf("Was recieved bytes %d\n",n);

if (n==SOCKET_ERROR)
{
printf("recvfrom() error:"\
"%d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
buff[n]=0;
if(*buff!=*line)
{
for(int i=0;i<strlen(buff);i++)
{
buffer[p+i] = buff[i];
//p += sizeof(buff);
}

p+=n;
buffer[p]=0;
//buffer[strlen(buff)]=0;
//buffer[strlen(buff) - 1] = '\0';
}
//else buffer[p]=0;

} 
//while(*buff!=*line) ;

// Вывод принятого с сервера сообщения об успешной операции на экран
printf("Client<=Server:%s",&buff[0]);

FILE *file;
char* file_name = CLIENT_FILE;
file = fopen( file_name, "w" ); 
fputs(buffer, file );
memset(buffer, 0, 30*Nsize * sizeof(char));
fclose( file );
}

//выход
closesocket(my_sock);
WSACleanup();

return 0;
}


Код сервера:
Код

#include <stdio.h>
#include <winsock2.h> // Включаем использование сокетов
#include <windows.h>
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку
#pragma comment (lib, "mswsock.lib")

#define PORT 15150 // порт сервера
#define Line "File is recivied"
#define slash "|" 
#define N 1024

int main(int argc, char* argv[])
{
char buff[N];

printf("Server start working...\n");

//подключение библиотеки 
WSADATA WsaData;
if( WSAStartup(0x0202, &WsaData) )
{
printf("Winsock cannot be started\r\n");
return false;
}
//создание сокета
SOCKET my_sock;
my_sock=socket(AF_INET,SOCK_DGRAM,0);
if (my_sock==INVALID_SOCKET)
{
printf("Socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}

//связывание сокета с локальным адресом 
sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(sockaddr_in));
local_addr.sin_family=AF_INET;
local_addr.sin_addr.s_addr=INADDR_ANY;
local_addr.sin_port=htons(PORT);

if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr)))
{
printf("bind error: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}

//обработка пакетов, присланных клиентами
while(1)
{
sockaddr_in client_addr;
memset(&client_addr, 0, sizeof(sockaddr_in));
int client_addr_size = sizeof(sockaddr_in);
int bsize=recvfrom(my_sock, buff, N * sizeof(char), 0, (sockaddr *) &client_addr, &client_addr_size);
if (bsize==SOCKET_ERROR)
{
printf("recvfrom() error: %d\n", WSAGetLastError());
break;
}

// Определяем IP-адрес клиента и прочие атрибуты
HOSTENT *hst;
hst=gethostbyaddr((char *)&client_addr.sin_addr,4,AF_INET);
printf("+%s [%s:%d] new DATAGRAM!\n",(hst)?hst->h_name:"Unknown host",inet_ntoa(client_addr.sin_addr),ntohs(client _addr.sin_port));

// добавление завершающего нуля
buff[bsize]=0;

// Вывод на экран 
printf("Client=>Server:%s\n",buff);

FILE *file;
char* file_name = buff;
//file_name[strlen(file_name) - 1] = '\0';
file = fopen( file_name, "r" );
if( file != 0 )
{
// int N = 1024;
char buffer[N + 1];
fseek(file,0,2);
int filesize = ftell(file);
fseek(file,0,0);
int filemarker = 0;
fseek(file,filemarker,0);
int szee = N;

while (szee == N)
{
printf("Recieve file - ");
memset(buffer, 0, N);
szee = fread(buffer, sizeof(char), N, file);
//buffer[szee - 1] = '\0';

sendto(my_sock,&buffer[0],szee,0,
(sockaddr *)&client_addr, sizeof(client_addr));
printf("filemarker = %d of filesize = %d \n", filemarker, filesize);
filemarker += szee;
}
char* line = Line;
sendto(my_sock,&line[0],strlen(&line[0]),0,
(sockaddr *)&client_addr, sizeof(client_addr));

fclose(file);
}
else
{
printf("File not found !!!");
}
}
system("PAUSE");
return 0;
}

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


Новичок



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

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



Мда...... Складывается такое впечатление, что я общаюсь сам с собой........   smile (((( 
Тем не менее я все же сумел доделать свою лабу. Окончательный вариант выглядит следующим образом (может пригодится тем, кто так же не может ни до кого достучаться...  smile )

Код клиента:
Код

#include <stdio.h> 
#include <string.h> 
#include <winsock2.h> // Включаем использование сокетов 
#include <windows.h> 
#include <memory.h> 
#include <string.h> 
 
   #pragma comment(lib, "WSock32.lib") // Используем эту библиотеку 
   #pragma comment (lib, "mswsock.lib") 
 
  #define PORT 15150 
  #define SERVERADDR "127.0.0.1" 
  #define CLIENT_FILE "example.txt" //файл на клиенте 
  #define Line "File is recivied" 
  int p; 
 
#define Nsize 1024 
  int main(int argc, char* argv[]) 
  { 
    char buffer[30*Nsize]; 
    char buff[Nsize + 1]; 
    printf("Client start working...\n"); 
 
    //иницилизация библиотеки Winsocks 
    WSADATA WsaData; 
    if( WSAStartup(0x0202, &WsaData) ) 
    { 
        printf("Winsock cannot be started\r\n"); 
        return false; 
    } 
 
    //открытие сокета 
    SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0); 
    if (my_sock==INVALID_SOCKET) 
    { 
      printf("socket() error: %d\n",WSAGetLastError()); 
      WSACleanup(); 
      return -1; 
    } 
 
    //обмен сообщений с сервером 
    // установка возможности широковещательного адреса 
    int i = 1; 
    if (setsockopt(my_sock, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1) 
    { 
        printf ("Error setting broadcast socket\n"); 
        WSACleanup(); 
        return -1; 
    } 
    HOSTENT *hst; 
    sockaddr_in dest_addr; 
    memset(&dest_addr, 0, sizeof(sockaddr_in)); 
    dest_addr.sin_family=AF_INET; 
    dest_addr.sin_port=htons(PORT); 
 
     
    // определение IP-адреса узла 
    if (inet_addr(SERVERADDR)) 
      dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR); 
    else 
      if (hst=gethostbyname(SERVERADDR)) 
        dest_addr.sin_addr.s_addr=((unsigned long **) 
              hst->h_addr_list)[0][0]; 
    else 
      { 
        printf("Unknown host: %d\n",WSAGetLastError()); 
        closesocket(my_sock); 
        WSACleanup(); 
        return -1; 
      } 
      
 
    while(1) 
    { 
      // чтение сообщения с клавиатуры 
      printf("\nClient=>Server:"); 
      scanf("%s", buff); 
      if (!strcmp(buff,"quit\n")) break; 
 
      int N=30; 
      printf("Number of block is:"); 
      scanf("%d", &N); 
      char blockN[3]; 
      sprintf(blockN, "%3d", N); 
      char tBuf[53]; 
      memcpy((void*)tBuf, (void*)blockN, 3); // в первые 3 символа пишем N 
      memcpy((void*)(tBuf+3), (void*)buff, 50); // пишем в tBuf содержимое buff 
 
      // Передача сообщений на сервер 
      sendto(my_sock, tBuf, strlen(tBuf), 0, (sockaddr *) &dest_addr,sizeof(sockaddr_in)); 
 
      // Прием сообщения с сервера 
      sockaddr_in server_addr; 
      int server_addr_size=sizeof(server_addr); 
      char* line = Line; 
      p = 0; 
 
      while(*buff!=*line) 
          { 
              memset(buff, 0, Nsize); 
              int n=recvfrom(my_sock,&buff[0],Nsize + 1,0, 
               (sockaddr *) &server_addr, &server_addr_size); 
 
                printf("Was recieved bytes %d\n",n); 
       
                if (n==SOCKET_ERROR) 
                { 
                   printf("recvfrom() error:"\ 
                   "%d\n",WSAGetLastError()); 
                   closesocket(my_sock); 
                   WSACleanup(); 
                   return -1; 
                } 
                buff[n]=0; 
                if(*buff!=*line) 
                { 
                for(int i=0;i<strlen(buff);i++) 
                { 
                  buffer[p+i] = buff[i]; 
                } 
                 
                p+=n; 
                buffer[p]=0; 
                } 
           }  
 
      // Вывод принятого с сервера сообщения об успешной операции на экран 
      printf("Client<=Server:%s",&buff[0]); 
 
      FILE *file; 
      char* file_name = CLIENT_FILE; 
        file = fopen( file_name, "w" );  
        fputs(buffer, file ); 
        memset(buffer, 0, 30*Nsize * sizeof(char)); 
        fclose( file ); 
    } 
 
    //выход 
    closesocket(my_sock); 
    WSACleanup(); 
 
    return 0; 
  }


Код сервера:
Код

#include <stdio.h> 
#include <winsock2.h> // Включаем использование сокетов 
#include <windows.h> 
#include <memory.h> 
#include <string.h> 
#pragma comment(lib, "WSock32.lib") // Используем эту библиотеку 
#pragma comment (lib, "mswsock.lib") 
 
  #define PORT 15150    // порт сервера 
  #define Line "File is recivied" 
  #define Nsize 1024 
 
  int main(int argc, char* argv[]) 
  { 
    char buff[Nsize]; 
 
    printf("Server start working...\n"); 
 
    //подключение библиотеки  
    WSADATA WsaData; 
    if( WSAStartup(0x0202, &WsaData) ) 
    { 
        printf("Winsock cannot be started\r\n"); 
        return false; 
    } 
    //создание сокета 
    SOCKET my_sock; 
    my_sock=socket(AF_INET,SOCK_DGRAM,0); 
    if (my_sock==INVALID_SOCKET) 
    { 
      printf("Socket() error: %d\n",WSAGetLastError()); 
      WSACleanup(); 
      return -1; 
    } 
 
    //связывание сокета с локальным адресом  
    sockaddr_in local_addr; 
    memset(&local_addr, 0, sizeof(sockaddr_in)); 
    local_addr.sin_family=AF_INET; 
    local_addr.sin_addr.s_addr=INADDR_ANY; 
    local_addr.sin_port=htons(PORT); 
 
    if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr))) 
    { 
      printf("bind error: %d\n",WSAGetLastError()); 
      closesocket(my_sock); 
      WSACleanup(); 
      return -1; 
    } 
 
    //обработка пакетов, присланных клиентами 
    while(1) 
    { 
      char tBuf[53]; 
      sockaddr_in client_addr; 
      memset(&client_addr, 0, sizeof(sockaddr_in)); 
      int client_addr_size = sizeof(sockaddr_in); 
      int bsize=recvfrom(my_sock, tBuf, Nsize * sizeof(char), 0, (sockaddr *) &client_addr, &client_addr_size); 
      if (bsize==SOCKET_ERROR) 
      { 
            printf("recvfrom() error: %d\n", WSAGetLastError()); 
            break; 
      } 
 
      // Определяем IP-адрес клиента и прочие атрибуты 
      HOSTENT *hst; 
      hst=gethostbyaddr((char *)&client_addr.sin_addr,4,AF_INET); 
      printf("+%s [%s:%d] new DATAGRAM!\n",(hst)?hst->h_name:"Unknown host",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); 
 
       char blockN[3]; 
       memcpy((void*)blockN, (void*)tBuf, 3); 
       memcpy((void*)buff, (void*)(tBuf+3), 50); //выделztv содержимое buff   
       int N = atoi(blockN); //определяем N 
       printf("\nNumber of block is:%d\n", N); 
 
      // добавление завершающего нуля 
      buff[bsize-3]=0; 
 
      // Вывод на экран  
      printf("Client=>Server:%s\n",buff); 
 
      FILE *file; 
      char* file_name = buff; 
      file = fopen( file_name, "r" ); 
      if( file != 0 ) 
      { 
            char buffer[Nsize + 1]; 
            fseek(file,0,2); 
            int filesize = ftell(file); 
            int filemarker = 0; 
            fseek(file,Nsize*N,0); 
            int szee = Nsize; 
 
             while (szee == Nsize) 
            { 
              printf("Recieve file - "); 
              memset(buffer, 0, Nsize); 
              szee = fread(buffer, sizeof(char), Nsize, file); 
 
              sendto(my_sock,&buffer[0],szee,0, 
              (sockaddr *)&client_addr, sizeof(client_addr)); 
              printf("filemarker = %d of filesize = %d \n", filemarker, filesize); 
              filemarker += szee; 
            } 
             char* line = Line; 
             sendto(my_sock,&line[0],strlen(&line[0]),0, 
              (sockaddr *)&client_addr, sizeof(client_addr)); 
 
          fclose(file); 
        } 
               else 
            { 
               printf("File not found !!!"); 
            } 
    } 
    system("PAUSE"); 
    return 0; 
  }

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


 




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


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

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