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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TClientSocket and TServerSocket, что-то не робит 
:(
    Опции темы
rubic_
Дата 15.2.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, нужна помощь. Решил разобраться в сетевом программировании на С++, но в сетях полный ноль. поискал по инету статьи(первоначальная задумка была создать что-нить простое. чтобы передавался какой-нить файл с сервера на клиент). Нашел статью, которая неплохо расписывала мою задумку.
Статья была на основе TClientSocket and TServerSocket. Я посчитал, что это способ проще по сравнению с функциями WinApi и решил начать с него.

В компоненте TClientSocket есть два свойства Adress and hostю в статье они заполнялись 127.0.0.1(я потом вкурил что это мой ip относительно себя. мол так удобней тестить) Но когда я попробывал приконнектиться к другому человеку, то тут встал вопрос, что в писывать в хост?
т.е.  есть 2 ip адреса. 1 внешний, другой внутренний. я прописал в поле 
Adress - внешний
host - внутренний
и странность в том. что если я запускаю со своего компа и клиент и сервер. они по этим адресам коннектяться, а если ко мне коннектяться с другого компа, то выдает ошибку, мол нет соединения.
В чем моя глупость состоит?
PM MAIL   Вверх
criz
Дата 15.2.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В Address нужно(желательно) вводить ИП машины, а в Host - имя машины.
TServerSocket'ом ты открываешь порт на прослушку, а TServerClient'ом - делаешь коннект.
З.Ы, вроде так smile
PM MAIL WWW   Вверх
rubic_
Дата 16.2.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну вот я тоже пока как-то так знаю. Хотелось бы ответ более уверенный и точныйsmile
PM MAIL   Вверх
criz
Дата 16.2.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В Address можно указывать только IP. А в Host'e можно ИП или хост-имя компа.
Если в Host указывается имя компа, то IP будет запрошен у DNS.
Вот ;)
PM MAIL WWW   Вверх
rubic_
Дата 17.2.2008, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



не работает не через имя, не через вн. ip/ скажите как правильно настроить его, чтобы он через инет робил?
PM MAIL   Вверх
criz
Дата 17.2.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Там не нужно никаких "внешних/внутренних IP". Указывать надо только IP-машины, к которой нужно приконнетиться.
Также надо указать открытый(прослушиваемый) порт удаленной машины. После установления соединения, можно передавать данные smile
PM MAIL WWW   Вверх
rubic_
Дата 18.2.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сервер
Код


#include <vcl.h>
#pragma hdrstop

#include "Server.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TMemoryStream *buffer = new TMemoryStream;
//Socket *mysocket = new Socket;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerAccept(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Log->Lines->Add("Связь установленна...");

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
  ErrorCode = 0;
  ShowMessage("Error!");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Server->Port = StrToInt(Port->Text);
  Server->Active = true;
  Server->Open();
  Log->Lines->Add("Сервер активен...");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  if (Server->Socket->Connections[0]->ReceiveText() == "end") 
  {
    Log->Lines->Add("Клиент принял файл"); 
    buffer->Clear();
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
void *P;   // указатель на файл
int Size ; // размер
if( OpenDialog1->Execute() )
{
    buffer->LoadFromFile( OpenDialog1->FileName ); // выбираем  файл
    Log->Lines->Add( "Загрузили требуемый файл в поток..." ); // заполняем лог
}
Server->Socket->Connections[0]->SendText( "file#" + OpenDialog1->FileName + "#" + IntToStr( buffer->Size ) + "#" );
// отправляем заголовок

Log->Lines->Add ( "Послали заголовок" );
buffer->Position = 0 ;      // Устанавливаем поток в начальную позицию ;
P    = buffer->Memory ;     // присваиваем указателю поток файла
Size = Server->Socket->Connections[0]->SendBuf( P , buffer->Size );               // отправляем буфер клиенту; Size
                                                                              //равно размеру отправленной  информации
Log->Lines->Add( "Отправлено: " + IntToStr( Size ) + " из " + IntToStr( buffer->Size ) );
}
//---------------------------------------------------------------------------

Клиент
Код

#include <vcl.h>
#pragma hdrstop

#include "client.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

TMemoryStream *MS = new TMemoryStream ; // создаем поток под принимаемый файл
void Write( AnsiString Text );          // ф-я записи получаемой информации в поток
int Size ;                              // размер передаваемого файла
bool Receive ;                          // передаем ли мы на данный момент файл
AnsiString FileName ;                   //  имя файла

void Write( AnsiString Text )
{
    if(MS->Size < Size)  // если мы еще принимаем файл и размер потока меньше размера файла
    {
        MS->Write( Text.c_str() , Text.Length() );         // записываем в поток
        Form1->Memo1->Lines->Add( "Принимаем данные..." ); // пишем лог
    }
    if(MS->Size == Size) // если файл принят и размер потока соответствует размеру файла
    {
        Receive = false ;                         // останавливаем режим передачи
        MS->Position = 0 ;                        // переводим каретку потока в начало
        Form1->Client->Socket->SendText( "end" ); // пишем серверу, что мы приняли файл
        CreateDir( "Downloads" );                 // создаем папку для сохраненных файлов
        MS->SaveToFile( "Downloads\\"+FileName ); // сохраняем туда наш файл
        MS->Clear() ;                             // освобождаем поток
        Size = 0 ;
        Form1->Memo1->Lines->Add("Файл принят !"); // пишем в лог что файл принят
    }
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    AnsiString Rtext ;  // текст, который посылает сервер
    Rtext = Client->Socket->ReceiveText() ;
    if( Receive == true ) // если мы в режиме передачи файла, то
    {
        Write( Rtext ); // записываем его в поток
    }
    else // если нет , то
    {
        Memo1->Lines->Add( "Приняли текст :" + Rtext );     // пишем в лог все что принимаем от сервера
        if(Rtext.SubString( 0,Rtext.Pos("#")-1) == "file" ) // Если это строка типа 
        // file#filename#filesize#, то начинаем парсерить полученную информацию :
        {
            Rtext.Delete( 1 , Rtext.Pos( "#" ) ) ;            // удаляем слово file
            Name = Rtext.SubString( 0 , Rtext.Pos( "#" ) -1 );// Определяем имя файла
            FileName = Name.SubString( Name.LastDelimiter( "\\" ) + 1 , Name.Length() );
            // Выделяем чистое имя файла , например с c:\\test.txt , берем test.txt
            Rtext.Delete( 1 , Rtext.Pos( "#" ) );                               // Удаляем последний разделитель
            Size = StrToInt( Rtext.SubString( 0 , Rtext.Pos( "#" ) - 1) ) ;     // Определяем размер файла
            Rtext.Delete( 1 , Rtext.Pos( "#" ) );                               // Удаляем последний разделитель
            Memo1->Lines->Add( "Размер файла: " + IntToStr( Size ) + " байт" ); // Выводим размер файла в лог
            Memo1->Lines->Add( "Имя файла: " + Name );                          // Выводим имя файла в лог
            Receive = true; 
            // Переводим сервер в режим приёма файла
            
        }
    }        
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo1->Lines->Add( "Вы присоеденились ;" );        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    ErrorCode = 0;
    ShowMessage( "Client Error" );          
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Client->Address = Edit1->Text;
        Client->Host = Edit2->Text;
    Client->Open() ;  // открываем
    Memo1->Lines->Add( "Коннектимся..." );        
}

если вбить в ip свой ip(внешний), а в хост имя компа. при условии, что сер запущен на той же машине все робит. Если с того же клиента запустить с теми же данными на дургой машине, не устанавливает связь.
PM MAIL   Вверх
criz
Дата 18.2.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Попробуй в ClientSocket1 ввести в address ИП сервера, а в Host внеси результат gethostbyaddr()....
З.Ы. вот пример на делфи -- http://docs.luksian.com/programming/delphi/prsokdelph/
PM MAIL WWW   Вверх
rubic_
Дата 20.2.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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